FileSystemWatcher-更新后要读取文件的最后一行吗?

时间:2019-06-01 13:18:28

标签: c# filesystemwatcher

我正在尝试编写一个简单的控制台应用程序,该应用程序等待文件的更改,然后仅读取该文件的最后一行。文件观察器工作,并且更改事件触发。但是我正在努力找出如何从文件中读取数据。

shinyjs::delay()

在测试(在记事本中编辑文件)时,它将运行一次,然后在第二次编辑后出现错误...

  

System.IO.IOException:'进程无法访问文件”,因为   它正在被另一个进程使用。'

2 个答案:

答案 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);