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

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);
    }

 

posted @ 2013-04-09 08:55  Jingle Guo  阅读(7911)  评论(5编辑  收藏  举报