【问题标题】:Can I prevent a StreamReader from locking a text file whilst it is in use?我可以防止 StreamReader 在使用文本文件时锁定它吗?
【发布时间】:2010-12-09 01:06:28
【问题描述】:

StreamReader 在读取文本文件时锁定它。
我可以强制 StreamReader 在“只读”或“非锁定”模式下工作吗?

我的解决方法是将文件复制到临时位置并从那里读取,但如果可能,我更愿意直接使用 StreamReader。 还有其他建议吗?

背景:
我编写了一个小应用程序来从日志文件中获取一些统计信息。这个文件不断被外部程序更新(每秒几次),让我们调用 AAXXYY。

查看输出表明我的应用程序可能正在锁定文件并阻止 AAXXYY 写入。

这就是我正在做的事情

    private void btnGetStats_Click(object sender, EventArgs e)
    {
        int countStarts = 0;
        int countEnds = 0;

        IList<string> sessions = new List<string>();

        using(StreamReader stRead = new StreamReader(openFileDialog1.FileName,Encoding.Unicode))
        {
            while(!stRead.EndOfStream)
            {
                string line = stRead.ReadLine();
                if(line.Contains("Session start"))
                {
                    countStarts++;
                    sessions.Add(line.Substring(line.IndexOf("["), line.LastIndexOf("]") - line.IndexOf("[")));
                }
                if (line.Contains("Session end"))
                {
                    countEnds++;
                    sessions.Remove(line.Substring(line.IndexOf("["), line.LastIndexOf("]") - line.IndexOf("[")));
                }
            }
        }

        txtStarts.Text = countStarts.ToString();
        txtEnds.Text = countEnds.ToString();
        txtDifference.Text = (countStarts - countEnds).ToString();

        listBox1.DataSource = sessions;
    }

【问题讨论】:

    标签: c# .net logging concurrency filelock


    【解决方案1】:

    您可以将 FileStream 传递给 StreamReader,并使用正确的 FileShare 值创建 FileStream。例如:

    using (var file = new FileStream (openFileDialog1.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    using (var reader = new StreamReader (file, Encoding.Unicode)) {
    }
    

    【讨论】:

    • +1 这很好用。谢谢你。虽然我不得不用 FileStream 和 StreamReader 替换“var”。 var 应该做什么?是VB吗?我认为应该编辑此答案以更改这些答案,但我没有代表自己做
    • 关于 'var' 关键字,请参阅此链接:msdn.microsoft.com/en-us/library/bb383973.aspx。该关键字是 C# 3.0+ 中的新关键字。
    • 啊哈。谢谢云。适合我在黑暗时代工作。可惜我不能 +1 评论 :-)
    • 哦,我可以 +1 评论。我们去
    • @Brian using statements 调用完成后自动处理
    【解决方案2】:

    我想我会添加一些上下文,StreamReader 不会锁定文件以供读取仅用于写入正在读取的文件。看看下面来自 StreamReader 类的代码。

     new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, FileOptions.SequentialScan);
    

    注意为 MSDN http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx 采用的默认 FileAccess.Read 参数

    允许随后打开文件进行读取。如果未指定此标志,则任何打开文件进行读取的请求(由该进程或其他进程)都将失败,直到文件关闭。但是,即使指定了此标志,仍可能需要其他权限才能访问该文件。

    再次取自 MSDN 以允许使用 FileAccess.ReadWrite 进行读写(正如 Jb Evain 所建议的那样)。

    允许随后打开文件以进行读取或写入。如果这 未指定标志,任何打开文件进行读取的请求或 写入(通过此进程或另一个进程)将失败,直到文件 已经关闭。然而,即使指定了这个标志,额外的 访问该文件可能仍需要权限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 2013-08-13
      • 2012-05-20
      • 1970-01-01
      • 2023-04-10
      • 2021-07-09
      • 1970-01-01
      相关资源
      最近更新 更多