FileSystemWatcher - чтение последней строки файла после обновления? - PullRequest
1 голос
/ 01 июня 2019

Я пытаюсь написать простое консольное приложение, которое ждет изменения файла, а затем читает только последнюю строку этого файла.Наблюдатель за файлами работает, и происходит событие изменения.Но я изо всех сил пытаюсь понять, как читать из файла.

        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: «Процесс не может получить доступ к файлу», поскольку он используется другим процессом. '

Ответы [ 2 ]

1 голос
/ 01 июня 2019

Я все еще сталкивался с проблемами с использованием 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);
1 голос
/ 01 июня 2019

Проблема связана с уже открытым дескриптором файла.File.ReadLines использует внутренний итератор, который является одноразовым.Используйте это, чтобы обеспечить удаление в течение срока службы вашего обработчика событий.

        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 # невозможны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...