(三)文件系统I/O
对于操作系统来说,所有的文件都是面向字节的,而磁盘文件是一种最常见的文件类型。C#中提供了以字节方式读写文件的方法,最常见的方法就是使用字节数据流读写文件,当然我们也能够将这些字节数据流包装在一个基于字符的对象中,使用字符数据流读写文件。
要创建一个附加到文件的字节数据流,我们可以使用FileStream类,由于FileStream类是派生于Stream类的字节数据流类,而对于操作系统来说文件都是面向字节的,所以使用FileStream类可以对一切文件进行读写操作,如可执行文件,目标文件,源文件等。
要读写文件,我们首先应该要知道的是如何去打开和关闭一个文件。FileStream类定义了多个构造函数,常用的有构造函数有以下两种:
FileStream(string path,FileMode mode);
FileStream(string path,FileMode mode,FileAccess access);
FileStream(string path,FileMode mode,FileAccess access,FileShare share);
其中,path指定了文件的完整路径,FileMode是枚举类型,指定了文件的创建模式,FileAccess是枚举类型,指定了文件的读写权限,FileShare是枚举类型,指定了文件的共享属性。下面详细讲述一个各个枚举类型及其值的含义。
值 | 说明 |
FileMode.Append | 把输出附加到文件末尾 |
FileMode.Open | 打开一个已经存在的文件 |
FileMode.OpenOrCreate | 打开一个文件,如果不存在,则创建一个新文件 |
FileMode.Create | 创建一个新的输出文件,已存在的同名文件将被销毁 |
FileMode.CreateNew | 创建一个新的输出文件,该文件不与已存在的文件同名 |
FileMode.Truncate | 打开一个已经存在的文件,文件的长度减小为0 |
值 | 说明 |
FileAccess.Read | 可读属性 |
FileAccess.Write | 可写属性 |
FileAccess.ReadWrite | 可读写属性 |
值 | 说明 |
Delete | 允许随后删除文件 |
Inheritable | 使文件句柄可有子进程继承,Win32不直接支持此功能 |
None | 谢绝共享当前文件,文件关闭前,打开该文件的任何请求(由此进程或另一进程)都将失败 |
Read | 允许随后打开文件读取,如果未指定此标志,则在文件关闭前,打开该文件进行读取的请求都将失败 |
Write | 允许随后打开文件写入,如果未指定此标志,则在文件关闭前,打开该文件进行写入的请求都将失败 |
ReadWrite | 允许随后打开文件读取或写入,如果未指定此标志,则在文件关闭前,打开该文件进行读取或写入的请求都将失败 |
在打开文件的时候,有可能会出现错误,这时就会抛出异常,常见的异常有IOException类(包含PathTooLongException,DirectoryNotFoundException和FileNotFoundException三个子类异常),ArgumentNullException(文件名为空),ArgumentException(文件名无效),ArgumentOutOfRangeException(模式无效),SecurityException(用户不具有访问权限)。
当我们使用完文件需要将其进行关闭,这时需要调用Close函数,该函数释放分配给文件的系统资源,实际是通过调用Dispose()方法来工作的,Dispose()方法实际的释放资源。