FileStream 的FileShare一点小认识
C#读写文本文件一般都是用StreamWriter来实现(读书的时候就这样用,毕业后这几年基本也是这样干的),通常代码如下:
using (StreamWriter sw = new StreamWriter(logpath,true,Encoding.UTF8))
{
sw.WriteLine(msg);
}
如果是web开发或则其他多线程的时候一般都是加锁(用lock),如果不同lock就会有error如:
这天我一同事推荐我说用FileStream可以不用lock,在多线程的情况下是不会有问题的,代码如下:
using (FileStream fs = new FileStream(logpath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
{
using (StreamWriter sw = new StreamWriter(fs))
{
sw.Write(msg);
}
}
经过测试后发现在多线程下却实没有问题,于是回头查看了以下StreamWriter的定义,
[SecurityCritical] internal StreamWriter(string path, bool append, Encoding encoding, int bufferSize, bool checkHost) : base(null) { if (path == null) { throw new ArgumentNullException("path"); } if (encoding == null) { throw new ArgumentNullException("encoding"); } if (path.Length == 0) { throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath")); } if (bufferSize <= 0) { throw new ArgumentOutOfRangeException("bufferSize", Environment.GetResourceString("ArgumentOutOfRange_NeedPosNum")); } Stream streamArg = CreateFile(path, append, checkHost); this.Init(streamArg, encoding, bufferSize, false); } [SecurityCritical] private static Stream CreateFile(string path, bool append, bool checkHost) { return new FileStream(path, append ? FileMode.Append : FileMode.Create, FileAccess.Write, FileShare.Read, 0x1000, FileOptions.SequentialScan, Path.GetFileName(path), false, false, checkHost); }
注意这里的CreateFile方法,里面用的是FileShare.Read,有关Read和 ReadWrite 的区别如下:
Read 允许随后打开文件读取。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取的请求(由此进程或另一进程发出的请求)都将失败。但 是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
ReadWrite 允许随后打开文件读取或写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取或写入的请求(由此进程或另一进程发出)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
我想单独就FileShare属性大家都知道,可是在这里就StreamWriter和FileStream大家是否也知道这个问题了。有关StreamReader/StreamWriter与FileStream用法详解如下:
http://blog.csdn.net/sansan52048/article/details/9160995
所以在涉及到文件操作的时候建议大家尽量用底层的FileStream操作。软件就是这样要不断学习、不断总结、不断前进。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构