我如何读取文本文件而不locking它?

我有一个Windows服务以简单的格式将其日志写入文本文件。

现在,我将创build一个小应用程序来读取服务的日志,并将现有日志和添加的日志显示为实时视图。

问题是该服务locking文本文件以添加新行,同时查看器应用程序locking文件以供阅读。

服务代码:

void WriteInLog(string logFilePath, data) { File.AppendAllText(logFilePath, string.Format("{0} : {1}\r\n", DateTime.Now, data)); } 

查看器代码:

 int index = 0; private void Form1_Load(object sender, EventArgs e) { try { using (StreamReader sr = new StreamReader(logFilePath)) { while (sr.Peek() >= 0) // reading the old data { AddLineToGrid(sr.ReadLine()); index++; } sr.Close(); } timer1.Start(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void timer1_Tick(object sender, EventArgs e) { using (StreamReader sr = new StreamReader(logFilePath)) { // skipping the old data, it has read in the Form1_Load event handler for (int i = 0; i < index ; i++) sr.ReadLine(); while (sr.Peek() >= 0) // reading the live data if exists { string str = sr.ReadLine(); if (str != null) { AddLineToGrid(str); index++; } } sr.Close(); } } 

我的代码在读写方面有什么问题吗?

如何解决这个问题?

您需要确保服务和阅读器都非独占打开日志文件。 尝试这个:

对于服务使用创build的FileStream实例如下:

 var outStream = new FileStream(logfileName, FileMode.Open, FileAccess.Write, FileShare.ReadWrite); 

对于读者使用相同,但更改文件访问权限:

 var inStream = new FileStream(logfileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 

祝你好运!

在读取文本文件时显式设置共享模式。

 using (FileStream fs = new FileStream(logFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (StreamReader sr = new StreamReader(fs)) { while (sr.Peek() >= 0) // reading the old data { AddLineToGrid(sr.ReadLine()); index++; } } } 
 new StreamReader(File.Open(logFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 

– >这不会locking文件。

问题是,当你正在写日志时,你只是locking文件,所以你的StreamReader将不被允许打开它。

您需要尝试以只读模式打开文件。

 using (FileStream fs = new FileStream("myLogFile.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (StreamReader sr = new StreamReader(fs)) { while (!fs.EndOfStream) { string line = fs.ReadLine(); // Your code here } } } 

我记得几年前做同样的事情。 经过一些谷歌查询,我发现这一点:

  FileStream fs = new FileStream(@”c:\test.txt”, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 

即在FileStream()上使用FileShare.ReadWrite属性。

(在Balaji Ramesh的博客上find)

你有没有尝试复制文件,然后阅读?

只要进行大的更改就更新副本。

此方法将帮助您最快地读取文本文件,而不locking它。

 private string ReadFileAndFetchStringInSingleLine(string file) { StringBuilder sb; try { sb = new StringBuilder(); using (FileStream fs = File.Open(file, FileMode.Open)) { using (BufferedStream bs = new BufferedStream(fs)) { using (StreamReader sr = new StreamReader(bs)) { string str; while ((str = sr.ReadLine()) != null) { sb.Append(str); } } } } return sb.ToString(); } catch (Exception ex) { return ""; } } 

希望这个方法能帮助你。