.NET文件与流操作全解析
立即解锁
发布时间: 2025-09-15 00:32:04 阅读量: 3 订阅数: 12 AIGC 

### .NET 文件与流操作全解析
在 .NET 编程中,文件和流操作是非常重要的一部分。下面将详细介绍相关的类和方法,帮助你更好地进行文件操作。
#### 1. 旧重载的过时
在 .NET 2.0 引入了一种表示操作系统句柄的新方式后,四种重载方法变得过时。那些接受 `IntPtr` 的重载方法被弃用,取而代之的是接受 `SafeFileHandle` 的新方法。
#### 2. 文件和目录操作概述
之前介绍的抽象概念通用性很强。例如,使用 `Stream` 时,无需知道字节的来源和去向;`TextReader` 和 `TextWriter` 也不要求数据有特定的来源或目的地。这使得代码可以应用于多种场景,如基于流的 `GZipStream` 可以对文件、网络连接或其他流中的数据进行压缩或解压缩。然而,当明确要处理文件并使用文件特定的功能时,就需要使用专门的类。
#### 3. FileStream 类
`FileStream` 类继承自 `Stream`,代表文件系统中的一个文件。它在基类的基础上增加的成员相对较少。`Lock` 和 `Unlock` 方法可在多进程使用单个文件时,获取对特定字节范围的独占访问权;`Name` 属性可获取文件名。
##### 3.1 构造函数
`FileStream` 的构造函数提供了很大的控制权,不考虑标记为 `[Obsolete]` 的构造函数,至少有 10 种构造函数重载。创建 `FileStream` 的方式可分为两类:
- 已有操作系统文件句柄:需要通过 `FileAccess` 枚举值告知 `FileStream` 该句柄对文件的访问权限(读、写或读写)。
- 没有操作系统文件句柄:更常用的方式是让 `FileStream` 使用操作系统 API 为你创建文件句柄。至少需要指定文件路径和 `FileMode` 枚举值。
`FileMode` 枚举值及其行为如下表所示:
| 值 | 文件存在时的行为 | 文件不存在时的行为 |
| ---- | ---- | ---- |
| CreateNew | 抛出 `IOException` | 创建新文件 |
| Create | 替换现有文件 | 创建新文件 |
| Open | 打开现有文件 | 抛出 `FileNotFoundException` |
| OpenOrCreate | 打开现有文件 | 创建新文件 |
| Truncate | 替换现有文件 | 抛出 `FileNotFoundException` |
| Append | 打开现有文件,将 `Position` 设置为文件末尾 | 创建新文件 |
还可以选择指定 `FileAccess`。如果不指定,除了选择 `Append` 模式外,`FileStream` 默认使用 `FileAccess.ReadWrite`。在 `Append` 模式下,文件只能写入,因此 `FileStream` 会选择 `Write`。如果在 `Append` 模式下传递除 `Write` 以外的 `FileAccess`,构造函数会抛出 `ArgumentException`。
以下是接受文件路径的 `FileStream` 构造函数示例:
```csharp
public FileStream(string path, FileMode mode)
public FileStream(string path, FileMode mode, FileAccess access)
public FileStream(string path, FileMode mode, FileAccess access,
FileShare share)
public FileStream(string path, FileMode mode, FileAccess access,
FileShare share, int bufferSize)
public FileStream(string path, FileMode mode, FileAccess access,
FileShare share, int bufferSize, bool useAsync)
public FileStream(string path, FileMode mode, FileAccess access,
FileShare share, int bufferSize, FileOptions options)
```
##### 3.2 FileShare 参数
接受 `FileShare` 类型参数的构造函数可让你指定是否需要对文件的独占访问权。
- `FileShare.None`:如果文件已在其他地方打开,构造函数会抛出 `IOException`;如果成功打开,在使用完之前,其他代码无法打开该文件。
- 其他值:可以允许其他进程或代码同时打开文件,并指定是否允许其他用户对文件进行读、写或读写操作。`FileShare` 是一个标志枚举,常见的组合 `FileShare.Read|FileShare.Write` 可使用预定义的 `ReadWrite` 值。
不接受显式 `FileShare` 参数的构造函数默认使用 `FileShare.Read`,表示代码允许其他代码同时以只读方式打开同一文件。例如,写入日志文件时,可使用 `FileMode.Append` 和 `FileShare.Read`,这样只有自己的代码可以追加日志条目,而其他代码可以以只读方式打开文件读取日志。
如果尝试打开已被其他代码打开的文件,只有指定的 `FileAccess` 和 `FileShare` 与先打开文件的代码使用的 `FileShare` 兼容时才能成功。同样,如果自己的代码已打开文件,选择的 `FileShare` 会决定其他代码在自己使用文件时可以成功应用的 `FileAc
0
0
复制全文
相关推荐










