C#对文件的操作相当方便,主要涉及到四个类:File、FileInfo、Directory、DirectoryInfo,前两个提供了针对文件的操作,后两个提供了针对目录的操作,类图关系如下:
图1:类图
下面通过实例来看下每个类的使用。
一、File类 File中提供了许多的静态方法,使用这些静态方法我们可以方便的对文件进行读写查等基本操作。
1、读文件
// 摘要:打开一个文件,将文件的内容读入一个字符串,然后关闭该文件。 public static byte [] ReadAllBytes( string path); // 摘要: 打开一个文本文件,读取文件的所有行,然后关闭该文件。 public static string [] ReadAllLines( string path); // 摘要:打开一个文件,使用指定的编码读取文件的所有行,然后关闭该文件。 public static string [] ReadAllLines( string path, Encoding encoding); // 摘要: 打开一个文本文件,读取文件的所有行,然后关闭该文件。 public static string ReadAllText( string path); // 摘要: 打开一个文件,使用指定的编码读取文件的所有行,然后关闭该文件。 public static string ReadAllText( string path, Encoding encoding); // 摘要: 读取文件的文本行。 public static IEnumerable< string > ReadLines( string path); // 摘要: 读取具有指定编码的文件的文本行。 public static IEnumerable< string > ReadLines( string path, Encoding encoding); |
2、写文件
// 摘要: 创建一个新文件,在其中写入指定的字节数组,然后关闭该文件。如果目标文件已存在,则覆盖该文件。 public static void WriteAllBytes( string path, byte [] bytes); // 摘要:创建一个新文件,在其中写入一组字符串,然后关闭该文件。 public static void WriteAllLines( string path, IEnumerable< string > contents); // 摘要:创建一个新文件,在其中写入指定的字符串数组,然后关闭该文件。 public static void WriteAllLines( string path, string [] contents); // 摘要:使用指定的编码创建一个新文件,在其中写入一组字符串,然后关闭该文件。 public static void WriteAllLines( string path, IEnumerable< string > contents, Encoding encoding); // 摘要:创建一个新文件,使用指定的编码在其中写入指定的字符串数组,然后关闭该文件。 public static void WriteAllLines( string path, string [] contents, Encoding encoding); // 摘要: 创建一个新文件,在其中写入指定的字符串,然后关闭文件。如果目标文件已存在,则覆盖该文件。 public static void WriteAllText( string path, string contents); // 摘要: 创建一个新文件,在其中写入指定的字符串,然后关闭文件。如果目标文件已存在,则覆盖该文件。 public static void WriteAllText( string path, string contents, Encoding encoding); |
3、追加内容
// 摘要: 在一个文件中追加文本行,然后关闭该文件。 public static void AppendAllLines( string path, IEnumerable< string > contents); // 摘要:使用指定的编码向一个文件中追加文本行,然后关闭该文件。 public static void AppendAllLines( string path, IEnumerable< string > contents, Encoding encoding); // 摘要:打开一个文件,向其中追加指定的字符串,然后关闭该文件。如果文件不存在,此方法创建一个文件,将指定的字符串写入文件,然后关闭该文件。 public static void AppendAllText( string path, string contents); // 摘要:将指定的字符串追加到文件中,如果文件还不存在则创建该文件。 public static void AppendAllText( string path, string contents, Encoding encoding); // 摘要: 创建一个 System.IO.StreamWriter,它将 UTF-8 编码文本追加到现有文件。 public static StreamWriter AppendText( string path); |
4、创建文件
// 摘要:在指定路径中创建或覆盖文件。 public static FileStream Create( string path); // 摘要:创建或覆盖指定的文件。 public static FileStream Create( string path, int bufferSize); // 摘要:创建或覆盖指定的文件,并指定缓冲区大小和一个描述如何创建或覆盖该文件的 System.IO.FileOptions 值。 public static FileStream Create( string path, int bufferSize, FileOptions options); // 摘要:创建或覆盖具有指定的缓冲区大小、文件选项和文件安全性的指定文件。 public static FileStream Create( string path, int bufferSize, FileOptions options, FileSecurity fileSecurity); |
5、打开文件
// 摘要: 打开指定路径上的 System.IO.FileStream,具有读/写访问权限。 public static FileStream Open( string path, FileMode mode); // 摘要:以指定的模式和访问权限打开指定路径上的 System.IO.FileStream。 public static FileStream Open( string path, FileMode mode, FileAccess access); // 摘要:打开指定路径上的 System.IO.FileStream,具有指定的读、写或读/写访问模式以及指定的共享选项。 public static FileStream Open( string path, FileMode mode, FileAccess access, FileShare share); // 摘要:打开现有文件以进行读取。 public static FileStream OpenRead( string path); |
6、获取和设置文件属性
// 摘要:获取一个 System.Security.AccessControl.FileSecurity 对象,它封装指定文件的访问控制列表 (ACL) 条目。 public static FileSecurity GetAccessControl( string path); // 摘要:获取一个 System.Security.AccessControl.FileSecurity 对象,它封装特定文件的指定类型的访问控制列表 (ACL)项。 public static FileSecurity GetAccessControl( string path, AccessControlSections includeSections); // 摘要: 获取在此路径上的文件的 System.IO.FileAttributes。 public static FileAttributes GetAttributes( string path); // 摘要:返回指定文件或目录的创建日期和时间。 public static DateTime GetCreationTime( string path); // 摘要:返回指定的文件或目录的创建日期及时间,其格式为协调世界时 (UTC)。 public static DateTime GetCreationTimeUtc( string path); // 摘要:返回上次访问指定文件或目录的日期和时间。 public static DateTime GetLastAccessTime( string path); // 摘要: 返回上次访问指定的文件或目录的日期及时间,其格式为协调世界时 (UTC)。 public static DateTime GetLastAccessTimeUtc( string path); // 摘要:返回上次写入指定文件或目录的日期和时间。 public static DateTime GetLastWriteTime( string path); // 摘要: 返回上次写入指定的文件或目录的日期和时间,其格式为协调世界时 (UTC)。 public static DateTime GetLastWriteTimeUtc( string path); // 摘要:对指定的文件应用由 System.Security.AccessControl.FileSecurity 对象描述的访问控制列表 (ACL) 项。 public static void SetAccessControl( string path, FileSecurity fileSecurity); // 摘要:设置指定路径上文件的指定的 System.IO.FileAttributes。 public static void SetAttributes( string path, FileAttributes fileAttributes); // 摘要:设置创建该文件的日期和时间。 public static void SetCreationTime( string path, DateTime creationTime); // 摘要:设置文件创建的日期和时间,其格式为协调世界时 (UTC)。 public static void SetCreationTimeUtc( string path, DateTime creationTimeUtc); // 摘要:设置上次访问指定文件的日期和时间。 public static void SetLastAccessTime( string path, DateTime lastAccessTime); // 摘要:设置上次访问指定的文件的日期和时间,其格式为协调世界时 (UTC)。 public static void SetLastAccessTimeUtc( string path, DateTime lastAccessTimeUtc); // 摘要:设置上次写入指定文件的日期和时间。 public static void SetLastWriteTime( string path, DateTime lastWriteTime); // 摘要:设置上次写入指定的文件的日期和时间,其格式为协调世界时 (UTC)。 public static void SetLastWriteTimeUtc( string path, DateTime lastWriteTimeUtc); |
7、复制、移动、替换
// 摘要:将现有文件复制到新文件。不允许覆盖同名的文件。 public static void Copy( string sourceFileName, string destFileName); // 摘要:将现有文件复制到新文件。允许覆盖同名的文件。 public static void Copy( string sourceFileName, string destFileName, bool overwrite); // 摘要:将指定文件移到新位置,并提供指定新文件名的选项。 public static void Move( string sourceFileName, string destFileName); // 摘要:使用其他文件的内容替换指定文件的内容,这一过程将删除原始文件,并创建被替换文件的备份。 public static void Replace( string sourceFileName, string destinationFileName, string destinationBackupFileName); // 摘要: 用其他文件的内容替换指定文件的内容,删除原始文件,并创建被替换文件的备份和(可选)忽略合并错误。 public static void Replace( string sourceFileName, string destinationFileName, string destinationBackupFileName, bool ignoreMetadataErrors); |
8、加密解密、删除、判定是否存在
// 摘要:将某个文件加密,使得只有加密该文件的帐户才能将其解密。 public static void Encrypt( string path); // 摘要:解密由当前帐户使用 System.IO.File.Encrypt(System.String) 方法加密的文件。 public static void Decrypt( string path); // 摘要: 删除指定的文件。如果指定的文件不存在,则不引发异常 public static void Delete( string path); // 摘要:确定指定的文件是否存在。 public static bool Exists( string path); |
通过上面的函数声明,大家应该很清楚如何是好这些方法了,这里就不举例说明了。
同时,看到如此多的函数,我们也很清楚的知道,File类已经可以满足我们对文件操作的基本需求了。File类通过静态方法的方式为我们提供了操作文件的途径。
FileInfo类 提供了与File类相同的功能,不同的是FileInfo提供的都是成员方法
1、读文件
1 2 3 4 | //摘要:创建只读 System.IO.FileStream。 public System.IO.FileStream OpenRead() //摘要:创建使用 UTF8 编码、从现有文本文件中进行读取的 System.IO.StreamReader。<BR>public System.IO.StreamReader OpenText() |
2、写文件
//摘要:创建只写 System.IO.FileStream。 public System.IO.FileStream OpenWrite() |
3、追加内容
//摘要:创建一个 System.IO.StreamWriter,它向 System.IO.FileInfo 的此实例表示的文件追加文本。 public System.IO.StreamWriter AppendText() |
4、打开文件
//摘要:在指定的模式中打开文件。 public System.IO.FileStream Open(System.IO.FileMode mode) //摘要:用读、写或读/写访问权限在指定模式下打开文件。 public System.IO.FileStream Open(System.IO.FileMode mode, System.IO.FileAccess access) //摘要:用读、写或读/写访问权限和指定的共享选项在指定的模式中打开文件。 public System.IO.FileStream Open(System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share) |
5、复制、移动、替换
//摘要:将现有文件复制到新文件,不允许覆盖现有文件。 public System.IO.FileInfo CopyTo( string destFileName) //摘要:将现有文件复制到新文件,允许覆盖现有文件。 public System.IO.FileInfo CopyTo( string destFileName, bool overwrite) //摘要:将指定文件移到新位置,并提供指定新文件名的选项。 public void MoveTo( string destFileName) //摘要:使用当前 System.IO.FileInfo 对象所描述的文件替换指定文件的内容,这一过程将删除原始文件,并创建被替换文件的备份。 public System.IO.FileInfo Replace( string destinationFileName, string destinationBackupFileName) //摘要:使用当前 System.IO.FileInfo 对象所描述的文件替换指定文件的内容,这一过程将删除原始文件,并创建被替换文件的备份。还指定是否忽略合并错误。 public System.IO.FileInfo Replace( string destinationFileName, string destinationBackupFileName, bool ignoreMetadataErrors) |
6、加密解密、删除
//摘要:将某个文件加密,使得只有加密该文件的帐户才能将其解密。 public void Encrypt() //摘要:解密由当前帐户使用 System.IO.FileInfo.Encrypt() 方法加密的文件。 public void Decrypt() //摘要:永久删除文件。 public override void Delete() |
7、获得文件属性
//摘要:获取父目录的实例。 public System.IO.DirectoryInfo Directory { get ; } //摘要:获取表示目录的完整路径的字符串。 public string DirectoryName { get ; } //摘要:获取指示文件是否存在的值。 public override bool Exists { get ; } //摘要:获取或设置确定当前文件是否为只读的值。 public bool IsReadOnly { set ; get ; } //摘要:获取当前文件的大小(字节)。 public long Length { get ; } //摘要:获取文件名。 public override string Name { get ; } |
在FileInfo中获取文件的相关属性不再是方法了,都是通过属性获得的,并且除是否只读属性为可读可写的,其他属性都是只读的。
小结
大家注意到,我们在介绍File类时,所有的操作都是通过静态方法实现的,并且返回值都是具体的值类型(暂且这样说),而在FileInfo中提供的方法不再是静态的,并且返回值都是FileStream类型的,是一个文件流,因此我们在使用FileInfo这个类时还需要结合FileStream类一起使用。
这也算是对File类与FileInfo类的错略的对比。
前面两篇介绍了File类和FileInfo类,对于文件的操作基本够用,但是后面还会补充一下FileStream相关的操作,例如StreamReader和StreamWriter的内容。本文主要介绍Directory类的使用,让我们一起看一下Directory类为我们提供了哪些操作。
Directory类 提供了大量的操作目录的静态方法,下面我们一一学习一下。
1、创建目录
1 2 3 4 | // 摘要:按 path 的指定创建所有目录和子目录。 public static DirectoryInfo CreateDirectory( string path); // 摘要:创建指定路径中的所有目录,并应用指定的 Windows 安全性。 public static DirectoryInfo CreateDirectory( string path, DirectorySecurity directorySecurity); |
这里要说明一下,我们使用CreateDirectory方法时,不是只能创建一级目录,而是可以创建一个层级目录,只要你指定的目录路径无此目录,就可以创建。
2、删除目录
1 2 3 4 | // 摘要:从指定路径删除空目录。 public static void Delete( string path); // 摘要:删除指定的目录并(如果指示)删除该目录中的任何子目录。 public static void Delete( string path, bool recursive); |
我们看方法的注释可以知道,第一个方法只能删除一个空的目录,若删除非空目录会提示错误,如图:
第二个方法则是可以通过指定第二个参数来控制是否递归删除子目录,因此,建议在使用时先使用第一个方法,当捕获到异常时,再提示使用第二个方法递归删除(此处只是个人建议,并非固定模式)。
3、获取子目录、文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | //获取目录集合<BR>// 摘要:返回指定路径中的目录名称的可枚举集合。 public static IEnumerable< string > EnumerateDirectories( string path); // 摘要:返回指定路径中与搜索模式匹配的目录名称的可枚举集合。 public static IEnumerable< string > EnumerateDirectories( string path, string searchPattern); // 摘要:返回指定路径中与搜索模式匹配的目录名称的可枚举集合,还可以搜索子目录。 public static IEnumerable< string > EnumerateDirectories( string path, string searchPattern, SearchOption searchOption); // 摘要:返回指定路径中的文件名的可枚举集合。 public static IEnumerable< string > EnumerateFiles( string path); // 摘要:返回指定路径中与搜索模式匹配的文件名称的可枚举集合。 public static IEnumerable< string > EnumerateFiles( string path, string searchPattern); // 摘要:返回指定路径中与搜索模式匹配的文件名称的可枚举集合,还可以搜索子目录。 public static IEnumerable< string > EnumerateFiles( string path, string searchPattern, SearchOption searchOption); // 摘要:返回指定路径中的文件系统项的可枚举集合。 public static IEnumerable< string > EnumerateFileSystemEntries( string path); // 摘要:返回指定路径中与搜索模式匹配的文件系统项的可枚举集合。 public static IEnumerable< string > EnumerateFileSystemEntries( string path, string searchPattern); // 摘要:返回指定路径中与搜索模式匹配的文件名称和目录名称的可枚举集合,还可以搜索子目录。 public static IEnumerable< string > EnumerateFileSystemEntries( string path, string searchPattern, SearchOption searchOption); //获取目录数组 // 摘要:获取指定目录中子目录的名称。 public static string [] GetDirectories( string path); // 摘要:从当前目录获取与指定搜索模式匹配的目录的数组。 public static string [] GetDirectories( string path, string searchPattern); // 摘要:获取当前目录中与指定搜索模式匹配并使用某个值确定是否在子目录中搜索的目录的数组。 public static string [] GetDirectories( string path, string searchPattern, SearchOption searchOption); <BR> //获取文件 // 摘要:返回指定目录中的文件的名称。 public static string [] GetFiles( string path); // 摘要: 返回指定目录中与指定搜索模式匹配的文件的名称。 public static string [] GetFiles( string path, string searchPattern); // 摘要: 返回指定目录中文件的名称,该目录与指定搜索模式匹配并使用某个值确定是否在子目录中搜索。 public static string [] GetFiles( string path, string searchPattern, SearchOption searchOption); // 摘要:返回指定目录中所有文件和子目录的名称。 public static string [] GetFileSystemEntries( string path); // 摘要: 返回与指定搜索条件匹配的文件系统项的数组。 public static string [] GetFileSystemEntries( string path, string searchPattern); // 摘要: 获取指定路径中与搜索模式匹配的所有文件名称和目录名称的数组,还可以搜索子目录。 public static string [] GetFileSystemEntries( string path, string searchPattern, SearchOption searchOption); |
通过上述的方法我们可以完成目录的遍历功能,所以大家在练习本节的方法时,希望是以完成一个目录遍历的小例子为最终目的,我会在下篇中上传我做的一个目录遍历的程序给大家做参考,希望能给大家提供帮助。
4、获取和设置目录属性
// 摘要:获取一个 System.Security.AccessControl.DirectorySecurity 对象,该对象封装指定目录的访问控制列表(ACL) 项。 public static DirectorySecurity GetAccessControl( string path); // 摘要:获取一个 System.Security.AccessControl.DirectorySecurity 对象,它封装指定目录的指定类型的访问控制列表(ACL) 项。 public static DirectorySecurity GetAccessControl( string path, AccessControlSections includeSections); // 摘要:获取目录的创建日期和时间。 public static DateTime GetCreationTime( string path); // 摘要:获取目录创建的日期和时间,其格式为协调世界时 (UTC)。 public static DateTime GetCreationTimeUtc( string path); // 摘要:返回上次访问指定文件或目录的日期和时间。 public static DateTime GetLastAccessTime( string path); // 摘要:返回上次访问指定文件或目录的日期和时间,其格式为协调世界时 (UTC)。 public static DateTime GetLastAccessTimeUtc( string path); // 摘要: 返回上次写入指定文件或目录的日期和时间。 public static DateTime GetLastWriteTime( string path); // 摘要: 返回上次写入指定文件或目录的日期和时间,其格式为协调世界时 (UTC)。 public static DateTime GetLastWriteTimeUtc( string path); // 摘要:将 System.Security.AccessControl.DirectorySecurity 对象描述的访问控制列表 (ACL) 项应用于指定的目录。 public static void SetAccessControl( string path, DirectorySecurity directorySecurity); // 摘要:为指定的文件或目录设置创建日期和时间。 public static void SetCreationTime( string path, DateTime creationTime); // 摘要:设置指定文件或目录的创建日期和时间,其格式为协调世界时 (UTC)。 public static void SetCreationTimeUtc( string path, DateTime creationTimeUtc); // 摘要:设置上次访问指定文件或目录的日期和时间。 public static void SetLastAccessTime( string path, DateTime lastAccessTime); // 摘要:设置上次访问指定文件或目录的日期和时间,其格式为协调世界时 (UTC)。 public static void SetLastAccessTimeUtc( string path, DateTime lastAccessTimeUtc); // 摘要:设置上次写入目录的日期和时间。 public static void SetLastWriteTime( string path, DateTime lastWriteTime); // 摘要:设置上次写入某个目录的日期和时间,其格式为协调世界时 (UTC)。 public static void SetLastWriteTimeUtc( string path, DateTime lastWriteTimeUtc); |
5、移动、判断是否存在
1 2 3 4 | // 摘要:将文件或目录及其内容移到新位置。 public static void Move( string sourceDirName, string destDirName); // 摘要: 确定给定路径是否引用磁盘上的现有目录。 public static bool Exists( string path); |
6、获取卷信息、根信息、当前工作目录
// 摘要:获取应用程序的当前工作目录。 public static string GetCurrentDirectory(); // 摘要:返回指定路径的卷信息、根信息或两者同时返回。 public static string GetDirectoryRoot( string path); // 摘要:检索此计算机上格式为“<盘符>:\”的逻辑驱动器的名称。 public static string [] GetLogicalDrives(); // 摘要:检索指定路径的父目录,包括绝对路径和相对路径。 public static DirectoryInfo GetParent( string path); // 摘要: 将应用程序的当前工作目录设置为指定的目录。 public static void SetCurrentDirectory( string path); |
总结
以上即为Directory类中为我们提供的可使用方法,并且和File类一样,这些方法都是静态的,通过结合这些方法的使用我们可以完成对目录的所有操作,本文就没有提供相关的范例,在下篇中会提供一个使用以上方法完成的一个简单的目录检索工具。