我如何读取文本文件而不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 ""; } }
希望这个方法能帮助你。