博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FileStream 的FileShare一点小认识
阅读量:6848 次
发布时间:2019-06-26

本文共 2031 字,大约阅读时间需要 6 分钟。

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操作

软件就是这样要不断学习、不断总结、不断前进。

转载于:https://www.cnblogs.com/clnchanpin/p/6780347.html

你可能感兴趣的文章
我的友情链接
查看>>
window下从硬盘安装ubuntu双系统
查看>>
socket服务器与客户机的互动
查看>>
三种方法实现选项卡效果
查看>>
API网关(API Gateway)
查看>>
Zookeeper集群搭建和简单使用
查看>>
IntelliJ IDEA快捷键
查看>>
Xmanager 连接 AIX 系统
查看>>
java的锁机制
查看>>
如何避免项目管理黑洞-为什么要使用redmine
查看>>
[]+与[]表达式
查看>>
.Net平台下ActiveMQ入门实例
查看>>
C#语言获取控制面板“程序和功能”列表
查看>>
外网语音通信准备资料
查看>>
写字机器人开发之:python opencv linux下合作操作摄像头
查看>>
if-else选择结构
查看>>
一 网络概述 每天记录一点点
查看>>
oracle 阻塞会话的查看与解除
查看>>
这个分类为Linux学习笔记
查看>>
java并发编程实践
查看>>