您的位置:首页 > 编程语言 > C#

C#之IO类库(一)——操作文件系统

2013-04-10 13:05 465 查看
出处 http://www.cnblogs.com/studynote/archive/2013/04/09/3009309.html
C#的IO类库提供了丰富的IO操作,下面我来总结一下其IO类库提供的一些操作文件系统的方法

一.操作驱动器

C#用DriveInfo来操作驱动器

1.创建对象

a.我们可以通过静态方法DriveInfo.GetDrives()来获取所有的Driver。

b.可以以Drive Letter为参数新建DriveInfo对象,注意DNS路径不能作为参数。

c.此外,我们还可以通过Directory.GetLogicalDrives()先获取机器上所有Driver的Driver letter,再用它新建DriveInfo对象以操作所有的Driver。

2.获取驱动器的状态

我们通过DriveInfo对象来获取驱动器的状态,可以获取的状态有

AvailableFreeSpace:获取当前用户被分配的可用空间大小(bytes)

TotalFreeSpace:获取所有可用空间大小(bytes)

TotalSize:获取总大小(bytes)

DriveFormat:返回FAT, NTFS等值

DriveType:返回DriveType类型的Enum值,可以是CDRom, Fixed, Network, NoRootDirectory, Ram, Removable,或者Unknown

IsReady:对Removable和CD-ROM来说只有相应的设备可以访问了才返回true,当该属性为false时,很多其他属性无法获取

Name:盘符名

RootDirectory:返回Driver所代表的路径的Directory对象。

VolumeLabel:返回VolumeLabel信息,VolumeLabel就是咱自己对盘符定义的名字

二.操作文件夹

C#提供了DirectoryInfo和Directory两个类来操作文件夹,这两个类提供了很多相同的方法,他们的区别在于DirectoryInfo是先构造一个文件夹对象,再对这个对象进行操作。而Directory提供的大多数都是静态函数,这样能够直接根据给定的文件夹路径进行相应的操作。在对文件夹进行多个操作时最好用DirectoryInfo,而只进行一个操作,最好用Directory。

1.构造对象

DirectoryInfo需要先构造文件夹对象,再获取文件夹属性,或者对文件夹进行操作。它的构造方法不负责判断路径是否存在。

Directory不需要构造文件夹对象,直接传入文件夹的路径进行操作

2.判断文件夹是否存在

DirectoryInfo对象可通过查看Exists属性查看文件夹是否存在

Directory可通过Exists方法查看文件夹是否存在

3.获取文件夹属性

注意,在用DirectoryInfo和Directory类获取文件夹属性前最好先判断其是否存在

对DirectoryInfo对象,在获取文件夹属性前应先用refresh函数刷新,可以访问文件夹的下列属性:

Attributes:archive, compressed, directory, hidden, offline, read-only, system, 和temporary的或值

CreationTime

CreationTimeUtc

LastAccessTime

LastAccessTimeUtc

LastWriteTime

LastWriteTimeUtc

Directory也可获取上述属性,不过是用静态函数获取,另外Directory也不支持获取Attribute。

SetCreationTime

SetCreationTimeUtc

SetLastAccessTime

SetLastAccessTimeUtc

SetLastWriteTime

SetLastWriteTimeUtc

GetCreationTime

GetCreationTimeUtc

GetLastAccessTime

GetLastAccessTimeUtc

GetLastWriteTime

GetLastWriteTimeUtc

4.路径操作

DirectoryInfo和Directory类都支持路径操作,这些操作只针对传入的路径字符串,和文件夹是否存在无关

DirectoryInfo有下面一些属性

Name

Extension

FullName

Parent

Root

Directory有下面一些方法

GetParent:获取父目录的DirectoryInfo对象

GetDirectoryRoot

5.新建,移动,删除文件夹

DirectoryInfo和Directory类都支持文件夹的新建,移动,删除

DirectoryInfo的方法

Create,CreateSubdirectory,Delete,MoveTo

Directory的方法

CreateDirectory

Delete

Move

6.遍历文件夹下的内容

DirectoryInfo和Directory类都支持遍历文件夹下的内容,而且都支持通过传入searchpattern和searchOption来定义遍历的行为,对于searchpattern,*匹配一个或多个字符,?匹配一个字符。searchOption的值是TopDirectory或AllDirectories,用来控制匹配的时候要不要包括子目录。

DirectoryInfo的方法:

EnumerateDirectories

EnumerateFiles

EnumerateFileSystemInfos

GetDirectories

GetFiles

GetFileSystemInfos

Directory的方法

GetDirectories

GetFiles

GetFileSystemEntries

EnumerateDirectories

EnumerateFiles

EnumerateFileSystemEntries

7.获取和设置当前的工作路径

Directory有两个重要的方法:

GetCurrentDirectory:获取当前的工作路径

SetCurrentDirectory:设置当前的工作路径

三.操作文件

C#提供了FileInfo和File两个类来操作文件,这两个类提供了很多相同的方法,他们的区别在于FileInfo是先构造一个文件对象,再对这个对象进行操作。而File提供的大多数都是静态函数,这样能够直接根据给定的文件路径进行相应的操作。在对文件进行多个操作时最好用FileInfo,而只进行一个操作,最好用File。

1.构造对象

FileInfo需要先构造文件对象,再获取文件属性,或者对文件进行操作。它的构造方法不负责判断路径是否存在。

File不需要构造文件对象,直接传入文件的路径进行操作

2.判断文件是否存在

FileInfo对象可通过查看Exists属性查看文件是否存在

File可通过Exists方法查看文件是否存在

3.获取文件属性

注意,在用FileInfo和File类获取文件属性前最好先判断其是否存在

对FileInfo对象,在获取文件属性前应先用refresh函数刷新,可以访问文件的下列属性:

Attributes:archive, compressed, directory, hidden, offline, read-only, system, 和temporary的或值

CreationTime

CreationTimeUtc

LastAccessTime

LastAccessTimeUtc

LastWriteTime

LastWriteTimeUtc

Length:文件大小

IsReadOnly

File也可获取上述属性,不过是用静态函数获取

GetAttributes

SetAttributes

SetCreationTime

SetCreationTimeUtc

SetLastAccessTime

SetLastAccessTimeUtc

SetLastWriteTime

SetLastWriteTimeUtc

GetCreationTime

GetCreationTimeUtc

GetLastAccessTime

GetLastAccessTimeUtc

GetLastWriteTime

GetLastWriteTimeUtc

4.路径操作

FileInfo提供了一些路径操作,这些操作只针对传入的路径字符串,和文件是否存在无关

FileInfo有下面一些属性

Name

Extension

FullName

Directory:返回DirectoryInfo对象

DirectoryName

Parent

Root

5.新建,移动,删除文件

FileInfo和File类都提供了新建,移动,删除文件操作

FileInfo的方法:

CopyTo

Create

Delete

MoveTo

Replace

File的方法

Copy

Create

Delete

Move

Replace

6.加密解密文件

FileInfo和File类都提供了Encrypt和Decrypt方法用来加密和解密文件,用某个用户加密的文件只有同一个用户能解密

四.监听文件夹

C#有个很有趣的类,FileSystemWatcher,这个类可以用来监听文件夹内文件的增加,删除,修改等事件。

1.定制监听的信息

通过设置FileSystemWatcher的一些属性来定制监听的信息

Path:监听的目录

NotifyFilter:用来设置对哪些类型的更改进行监视

监视的类型为FileName,DirectoryName,Attributes,Size,LastWrite,LastAccess,CreationTime,Security的或值。默认为LastWrite, FileName, DirectoryName的或值

InternalBufferSize:内部缓存区的大小,默认8KB,最小4KB,最大64KB

Filter:可以用通配符过滤文件,*匹配一个或多个字符,?匹配一个字符

IncludeSubdirectories:是否监听子目录

2.定制事件发生后的行为

文件夹里会发生下述事件

Changed

Created

Deleted

Renamed

我们通过给这些事件加事件处理器来处理事件

另外还可以用WaitForChanged来监听某个指定类型的消息然后返回

3.启动监听

只有当EnableRaisingEvents为true且Path有值时,才能监听成功,当我们将所有信息设置好后,就可以通过设置这个值启动和停止监听了

4.用BeginInit和EndInit来阻止component在初始化完成前使用,一般将一系列的操作写在这两个函数之间。

5.在Form中定义的时候必须将Form控件赋给SynchronizingObject属性

6.简单的示例:

监听"C:\jingle"文件夹下面所有文件和文件夹的重命名操作

[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
public static void Run()
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = "c:\\jingle";
watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.IncludeSubdirectories = true;
watcher.Filter = "*.*";

watcher.Renamed += new RenamedEventHandler(OnRenamed);

watcher.EnableRaisingEvents = true;

Console.Read();
}

private static void OnRenamed(object source, RenamedEventArgs e)
{
Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
}


C#还提供了专门操作路径的Path类,用一些静态方法,能很方便的获取路径的文件名,后缀等信息,不赘述了,直接上ms的总结

ChangeExtension 更改路径字符串的扩展名。

Combine(String[]) 将字符串数组组合成一个路径。

Combine(String, String) 将两个字符串组合成一个路径。

Combine(String, String, String) 将三个字符串组合成一个路径。

Combine(String, String, String, String) 将四个字符串组合成一个路径。

GetDirectoryName 返回指定路径字符串的目录信息。

GetExtension 返回指定的路径字符串的扩展名。

GetFileName 返回指定路径字符串的文件名和扩展名。

GetFileNameWithoutExtension 返回不具有扩展名的指定路径字符串的文件名。

GetFullPath 返回指定路径字符串的绝对路径。

GetInvalidFileNameChars 获取包含不允许在文件名中使用的字符的数组。

GetInvalidPathChars 获取包含不允许在路径名中使用的字符的数组。

GetPathRoot 获取指定路径的根目录信息。

GetRandomFileName 返回随机文件夹名或文件名。

GetTempFileName 创建磁盘上唯一命名的零字节的临时文件并返回该文件的完整路径。

GetTempPath 返回当前用户的临时文件夹的路径。

HasExtension 确定路径是否包括文件扩展名。

IsPathRooted 获取指示指定的路径字符串是否包含根的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: