C# FileStream FileShare 枚举作用 作者:马育民 • 2025-08-08 16:33 • 阅读:10002 # 说明 `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 原文出处:http://malaoshi.top/show_1GW1dfgyBXtM.html