我正在尝试编写一个简单的控制台应用程序,该应用程序等待文件的更改,然后仅读取该文件的最后一行。文件观察器工作,并且更改事件触发。但是我正在努力找出如何从文件中读取数据。
shinyjs::delay()
在测试(在记事本中编辑文件)时,它将运行一次,然后在第二次编辑后出现错误...
System.IO.IOException:'进程无法访问文件”,因为 它正在被另一个进程使用。'
答案 0 :(得分:1)
问题是由于文件的句柄已经打开。 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#中不可行检查和释放文件句柄。
答案 1 :(得分:1)
我仍然在使用line.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);