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;
}
答案 0 :(得分:42)
您可以将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 :(得分:6)
以为我会添加一些上下文,StreamReader 不会锁定文件以便读取仅用于写入 whist正在读取。从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建议)。
允许随后打开文件进行读写。如果这 未指定flag,任何打开文件进行读取的请求或 写入(通过此过程或其他过程)将失败直到该文件 关闭了。但是,即使指定了此标志,也需要额外的 访问该文件可能仍需要权限。