.NET 中文件打开的 API File.Open
提供了多种不同的文件打开方式,这些方式大多数与 Windows 文件 API 中的模式是对应的,但也有一些 .NET 层面的判断以及名称的变化。在 .NET 层你可以选择适合你业务场景需要的文件打开方式。
文件打开方式
文件打开的多个重载方法中,除了封装好的 OpenRead
/ OpenWrite
之外,其他都是需要指定 FileMode
参数的。
public static FileStream Open(string path, FileMode mode);
FileMode
FileMode 枚举有 6 种不同的值:
public enum FileMode
{
CreateNew = 1,
Create = 2,
Open = 3,
OpenOrCreate = 4,
Truncate = 5,
Append = 6,
}
为了方便查阅,我先将大家可能关心的内容做一个表格:
FileMode | 如果文件存在 | 如果文件不存在 |
---|---|---|
CreateNew | IOException | 新建 |
Create | 截断 | 新建 |
Open | 打开 | FileNotFoundException |
OpenOrCreate | 打开 | 新建 |
Truncate | 截断 | FileNotFoundException |
Append | 追加 | 新建 |
所有这些打开模式都不会修改到文件的属性(Attribute),包括创建时间、针对用户的权限设置。所以如果你希望连这些属性都不需要,而是完完全全创建新的文件,那么请先将原来的文件删除。
注意,在 File.Open
方法中传入以下这些参数的含义描述中可能有一些包含过程和判断的语句,但实际上这些真正的判断和过程发生在 Windows 内核(虽然 .NET 也有一些判断,但是一些参数预判断和参数转换),所以实际拿到文件流(对应 Win32 中拿到句柄)是一个原子操作,不会因为中间加了判断导致与其他线程发生竞争。
CreateNew
如果文件不存在,则创建一个新的文件并返回新文件的文件流。如果文件已经存在,则抛出 IOException
。
Create
如果文件不存在,则创建一个新的文件并返回新文件的文件流。如果文件已经存在,则打开文件并返回此文件的文件流。
基于此文件流的修改会完全复写文件。也就是说,