zoukankan      html  css  js  c++  java
  • FileStream 的FileShare一点小认识

    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操作。软件就是这样要不断学习、不断总结、不断前进。

    windows技术爱好者

  • 相关阅读:
    wdcp升级php和mysql
    centos安装中文支持(转)
    centos5.5用phpstudy一键安装配置虚拟主机后,yum配置代理服务器squid
    http status 汇总
    关于html标签元素的data-*属性
    [分 享] PHPCMS V9 更换域名,附件地址无法批更新(更换变便)问题>解决方法!!
    svn服务器配置小记
    Camstar Portal modeling user guid --设置本地时间
    msdn webcast 下载地址整理
    mvc 项目下 webservice 程序无法运行
  • 原文地址:https://www.cnblogs.com/grj001/p/12225401.html
Copyright © 2011-2022 走看看