FileStream 的FileShare一点小认识
来源:互联网 发布:java web 开发 编辑:程序博客网 时间:2024/05/22 01:46
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操作。软件就是这样要不断学习、不断总结、不断前进。
- FileStream 的FileShare一点小认识
- 关于actionAdapter的一点小认识
- 对extern "C"的一点小认识
- 对extern "C"的一点小认识
- 我对C++函数重载的一点小认识
- 对于jsp和servlet的一点小认识
- 自己对单点登录的一点小认识
- CCIR656的一点认识
- oop的一点认识
- MessageBox的一点认识
- 软件的一点认识
- weak_ptr的一点认识
- SLAM的一点认识
- SLAM的一点认识
- SLAM的一点认识
- 对FileStream的几种属性和方法认识
- 对Final的一点认识
- 对Final的一点认识
- 校招回忆录---华为篇(下)
- vs2012编译gtest错误error C2955
- 剑指offer 3.4 代码的鲁棒性1- 链表中倒数第K个节点
- Android 学习历程摘要(一)
- 使用socket.io和node.js搭建websocket应用
- FileStream 的FileShare一点小认识
- hdu 4862解题报告
- android学习--视图列表(ListView和ListActivity)
- poj1598(字符串处理)
- 【九度OJ】1029【HashMap查找】
- 每天一个Linux命令
- Code Review(一)
- MySQL索引类型总结和使用技巧以及注意事项
- POJ 1062 昂贵的聘礼