C# FileStream FileShare 枚举作用

说明

FileShare 枚举包含用于控制其他操作对同一文件可以具有的访问类型的常量

命名空间: System.IO

官网:https://learn.microsoft.com/zh-cn/dotnet/api/system.io.fileshare?view=net-6.0

一句话解释

第一次读写文件后,没有关闭流时,控制第二次读写文件流的 访问权限

字段

名称 值 说明
Delete 4 允许随后删除文件。
Inheritable 16 使文件句柄可由子进程继承。Win32不直接支持此功能。
None 0 谢绝共享当前文件。文件关闭前,打开该文件的任何请求(由此进程或另一进程发出的请求)都将失败。
Read 1 允许随后打开文件读取。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取的请求(由此进程或另一进程发出的请求)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
ReadWrite 3 允许随后打开文件读取或写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取或写入的请求(由此进程或另一进程发出)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
Write 2 允许随后打开文件写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行写入的请求(由此进程或另一进过程发出的请求)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。

解释

准备工作

为了更好的理解,这里定义两个读写文件方法:

static void WriteFile(FileMode fileMode, FileAccess fileAccess, FileShare fileShare)
{
    Console.WriteLine("please input your content.");
    var content = Console.ReadLine();
    FileStream fs = new FileStream(FILEPATH, fileMode, fileAccess, fileShare);
    var buffer = Encoding.Default.GetBytes(content);
    fs.Write(buffer, 0, buffer.Length);
    fs.Flush();
}
static void ReadFile(FileAccess fileAccess, FileShare fileShare)
{
    FileStream fs = new FileStream(FILEPATH, FileMode.Open, fileAccess, fileShare);
    var buffer = new byte[fs.Length];
    fs.Position = 0;
    fs.Read(buffer, 0, buffer.Length);
    Console.WriteLine(Encoding.Default.GetString(buffer));
}

FileShare.Read 解释

读取文件之后(资源未释放),可以再用 只读 的方式读取文件,不会抛出文件无法访问的异常

ReadFile(FileAccess.Read, FileShare.Read);
ReadFile(FileAccess.Read, FileShare.Read);

报错

注意:先写后读会报错

WriteFile(FileMode.Create, FileAccess.Write, FileShare.Read);
ReadFile(FileAccess.Read, FileShare.Read);

注意:先读后写会报错

ReadFile(FileAccess.Read, FileShare.Read);
WriteFile(FileMode.Create, FileAccess.Write, FileShare.Read);

FileShare.Write 解释

只有在 写文件 时设置共享方式为 Write,随后才能继续 写入文件,否则会抛出异常

WriteFile(FileMode.Create, FileAccess.Write, FileShare.Read);
WriteFile(FileMode.Create, FileAccess.Write, FileShare.Read);

报错

注意:无论先写后读,还是先读后写都会报错

ReadFile(FileAccess.Read, FileShare.Read);
WriteFile(FileMode.Create, FileAccess.Write, FileShare.Read);

FileShare.ReadWrite 解释

结合了 Read 和 Write 的特性:可读可写

ReadFile(FileAccess.Read, FileShare.Read);
WriteFile(FileMode.Create, FileAccess.Write, FileShare.Read);

FileShare.None 解释

不允许后续有任何操作

FileShare.Delete 解释

允许随后进行删除操作

File类读写文件底层代码分析

对于文件操作,我们平常使用的比较多的可能是以下几种:

File.AppendAllText("......");
File.AppendAllLines(...);
File.AppendText(...);
FileStream fs = new FileStream(path, FileAccess.Write);
fs.Write(....);

实际上它们也是在内部初始化了FileMode/FileAccess/FileShare,例如File的静态方法最后都会生成一个Stream实例,其中便调用了私有方法CreateFile

参考:
https://www.cnblogs.com/feiyuhuo/p/5414788.html