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;
    }
有帮助吗?

解决方案

您可以将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)) {
}

其他提示

以为我会添加一些上下文,StreamReader 锁定文件以便读取仅用于写入 whist正在读取。从StreamReader类看一下下面的代码。

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

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

  

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

再次从MSDN中获取允许读写的使用FileAccess.ReadWrite(由Jb Evain建议)。

  

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top