最近在工作中使用到了文件操作类,但是发现自己对这块基础掌握还是比较薄弱。因此决定对这块内容好好学习,并记录自己的学习理解。
一、目前对于文件处理主要是使用流来操作,那么我们首先了解一下什么是流(stream)。流是一个用于传输数据的对象。
流具有如下3种基本操作:
- 写入:将数据从内存缓冲区传输到外部源;
- 读取:将数据从外部源传输到内存缓冲区;
- 查找:重新设置流的当前位置,以便随机读写。但并不是所有的流类型都支持查找,如网络流类没有当前位置的概念,就不支持查找。
Stream是虚拟类,它以及它的派生类都提供了Read和Write方法,可以支持在字节级别上对数据进行读写。Read方法从当前字节流读取字节放至内存缓冲区,Write方法把内存缓冲区的字节写入当前流中。
封装的其他流类
但仅支持字节级别的数据处理会给开发人员带来不便。将定应用程序需要将字符数据写入到流中,则需要先将字符数据转化为字节数组之后才能调用Write方法写入流。因此,除了Stream及其派生类的读写方法之外,.Net框架同样提供了其他多种支持流读写的类:
-
- BinaryReader:从Streams读取编码的字符串和基元数据类型;
- BinaryWriter:向Streams写入编码的字符串和基元数据类型;
- StreamReader:通过使用Encoding将字符转换为字节,向Streams写入字符;
- StreamWriter:通过使用Encoding进行字符和字节的转换,可直接从Streams中读取字符;
二、常用的文件读写类
1)FileStream (文件流) 主要用于在二进制文件中读取二进制数据
2)StreamReader (流读取器)和StreamWriter (流写入器) 专门用于读取文本格式的流产品
3)BinaryReader和BinaryWriter 专门读写二进制格式的流产品
三、文件读写类的具体使用
1、FileStream
Filestream为文件提供 Stream,既支持同步读写操作,也支持异步读写操作。下面的示例展示了部分 FileStream 构造函数。
var path = @"d:\MyTest.txt";
string str = "看数据会不会被覆盖掉";
byte[] buffer = Encoding.Default.GetBytes(str);
byte[] bufferRead = new byte[1024 * 1024 * 5]; //声明一个5M大小的字节数组
///path参数可以是文件名,包括通用命名约定中的文件 (UNC) 共享。
// 为构造函数提供对文件的读 / 写访问权限,并打开共享读取访问(也就是说,通过此或其他进程打开文件以进行写入的请求将失败,直到该 FileStream 对象关闭,但读取尝试将成功) 。
// 不能使用此构造函数打开只读文件; 相反,必须使用接受 FileAccess 值设置为的参数的构造函数 FileAccess.Read 。
using (FileStream aFile1 = new FileStream(path, FileMode.OpenOrCreate))
{
//向文件中写入数据
//aFile1.Write(buffer);
//读取文件数据
aFile1.Read(bufferRead, 0, bufferRead.Length);
var content = Encoding.Default.GetString(bufferRead);
Console.WriteLine(content);
}
///打开文件并选择对该文件的读/写权限,如果该文件不存在则创建该文件,并且具备对该文件的读写权限.这里要注意你运行的软件需要对该文件夹有访问权限否则会引发异常,显示你无权限。
FileStream aFile2 = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite);
///打开文件并可以设置文件读写权限以及对文件的访问类型
FileStream aFile3 = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite,FileShare.Read);
///这个是一个功能比较强大但是实际使用中较少是的一种构造函数
///share FileShare
// 枚举值的按位组合,这些枚举值确定进程共享文件的方式。
// bufferSize Int32
// 一个大于零的正 Int32 值,表示缓冲区大小。 默认缓冲区大小为 4096。
// useAsync Boolean
FileStream aFile4 = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read, 4096, false);
在Filestream初始化时一般来说需要以下几个基础信息:
(1)FileMode:指定操作系统打开文件的方式。该枚举具有以下属性
Append | 6 | 若存在文件,则打开该文件并查找到文件尾,或者创建一个新文件。 这需要 Append 权限。 |
Create | 2 | 指定操作系统应创建新文件。 如果此文件已存在,则会将其覆盖。 这需要 Write 权限。 |
CreateNew | 1 | 指定操作系统应创建新文件。 这需要 Write 权限。 如果文件已存在,则将引发 IOException异常。 |
Open | 3 | 指定操作系统应打开现有文件。 打开文件的能力取决于 FileAccess 枚举所指定的值。 如果文件不存在,引发一个 FileNotFoundException 异常。 |
OpenOrCreate | 4 | 指定操作系统应打开文件(如果文件存在);否则,应创建新文件。 如果用 |