![](/img/trans.png)
[英]Reading the last line of a text file after FileSystemWatcher detects change
[英]FileSystemWatcher - Reading last line of file after update?
我试图编写一个简单的控制台应用程序,等待对文件的更改,然后仅读取该文件的最后一行。 文件观察器工作,并且更改事件触发。 但是我正在努力研究如何从文件中读取。
static void Main(string[] args)
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.NotifyFilter = NotifyFilters.LastWrite;
watcher.Path = "E:\\myFilePath";
watcher.Filter = "";
watcher.EnableRaisingEvents = true;
watcher.Changed += new FileSystemEventHandler(watcher_Changed);
Console.ReadKey();
}
static void watcher_Changed(object sender, FileSystemEventArgs e)
{
Console.WriteLine(File.ReadLines(e.FullPath).Last());
}
测试(在记事本中编辑文件)时,它将运行一次,然后在第二次编辑后出现错误...
System.IO.IOException:'该进程无法访问文件”,因为它正在被另一个进程使用。
问题是由于文件的句柄已经打开。 File.ReadLines
在内部使用一个Disposable的迭代器。 使用它来确保在事件处理程序的生命周期内进行处置。
static void watcher_Changed(object sender, FileSystemEventArgs e)
{
var lines = File.ReadLines(e.FullPath);
Console.WriteLine(lines.Last());
lines.GetEnumerator().Dispose();
}
这应该保证在事件处理程序结束之前进行处理。
编辑:如果其他进程持有对该文件的写锁,请在安全的时间内使用Thread.Sleep(ms)
,因为在C#中不可行检查和释放文件句柄。
我仍然在使用lines.GetEnumerator()。Dispose();时遇到问题。
您可以在打开文件之前添加一个暂停,只需为此选择毒药即可。
static void watcher_Changed(object sender, FileSystemEventArgs e)
{
for (int x = 0; x <= 500000; x++)
{
int t = x;
}
Console.WriteLine(File.ReadLines(e.FullPath).Last());
}
我也尝试过使用SreamReader,但仍然遇到相同的问题。
// Does not work
using (StreamReader r = new StreamReader(e.FullPath))
{
while (r.EndOfStream == false)
{
m = r.ReadLine();
}
r.Close();
}
Console.WriteLine("{0}\n", m);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.