2009-10-22 60 views
17

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

我的解决方法是将文件复制到临时位置并从那里读取,但如果可能,我宁愿直接使用StreamReader。 任何替代suggetions?

背景:
我写了一个小应用程序来获取日志文件的一些统计数据。该文件不断更新(每秒几次)由外部程序调用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; 
    } 

回答

38

你可以传递一个FileStream的StreamReader的,并创建适当的文件共享价值的FileStream。例如:

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

+1这很好。谢谢。尽管我必须用FileStream和StreamReader替换“var”。什么是var suppossed做?那是VB吗? 我认为应该编辑这个答案来改变那些,但我没有代表自己做 – 2009-10-22 11:18:30

+6

关于'var'关键字,请参阅此链接:http://msdn.microsoft.com/en-us/library/bb383973的.aspx。该关键字在C#3.0+中是新的。 – pyrocumulus 2009-10-22 11:19:50

+0

啊哈。谢谢云。为我在黑暗时代工作适合我。耻辱我不能+1评论:-) – 2009-10-22 11:28:34

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所建议的)。

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

相关问题