我可以阻止StreamReader在使用时锁定文本文件吗?

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

我的解决方法是将文件复制到临时位置并从那里读取,但我更愿意直接使用StreamReader。 任何替代建议?

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

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

这就是我正在做的事情

private void btnGetStats_Click(object sender, EventArgs e) { int countStarts = 0; int countEnds = 0; IList sessions = new List(); 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所建议)。

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