24

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;
    }
4

2 回答 2

51

您可以将 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)) {
}
于 2009-10-22T10:40:10.197 回答
6

以为我会添加一些上下文,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 所建议)。

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

于 2012-10-17T13:40:50.187 回答