说明
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