繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM