FileSystemWatcher – Lettura ultima linea di file dopo l’aggiornamento?

sto cercando di scrivere una semplice applicazione console che attende un cambiamento in un file, quindi legge solo l’ultima riga di quel file. il file watcher funziona e il cambiamento degli eventi incendi. ma sto lottando per capire come leggere dal file.

        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());
        }

durante il test (modificare il file in blocco note) funzionerà una volta, poi dopo una seconda modifica ottengo l’errore…

System.IO.IOException: ‘The process cannot access the file ” because
it is being used by another process.’

EN From: FileSystemWatcher – Reading last line of file after update?

More similar articles:

8 Comments

  1. il problema è dovuto ad una maniglia già aperta al file. File.ReadLines utilizza un iteratore internamente che è monouso. utilizzare questo per garantire lo smaltimento durante la vita del gestore dell’evento.

            static void watcher_Changed(object sender, FileSystemEventArgs e)
            {
                var lines = File.ReadLines(e.FullPath);
                Console.WriteLine(lines.Last());
                lines.GetEnumerator().Dispose();
            }

    questo dovrebbe garantire lo smaltimento prima della fine dell’evento gestore.

    Edit: nel caso in cui un processo diverso è in possesso di un blocco di scrittura al file, utilizzare Thread.Sleep(ms) con un tempo sicuro come il controllo e il rilascio di file maniglie non è fattibile in C #.

    1. purtroppo questo non ha funzionato per me. stessi risultati, funziona prima volta, errori sul secondo aggiornamento file.

  2. ho ancora incontrato problemi utilizzando lines.GetEnumerator () .Dispose ();

    è possibile aggiungere una pausa prima di aprire il file, basta scegliere il veleno per farlo.

        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());
        }

    ho provato a utilizzare SreamReader troppo, ma ancora corse nello stesso problema.

            // Does not work
            using (StreamReader r = new StreamReader(e.FullPath))
            {
                while (r.EndOfStream == false)
                {
                    m = r.ReadLine();
                }
                r.Close();
            }
            Console.WriteLine("{0}\n", m);
  3. si noti che l’evento Changed verrà rilanciato due volte per lo stesso file. cache il nome dell’ultimo file e non fare nulla se è lo stesso file che si sta già analizzando.

  4. l’evento si accende quando il “LastWritten” timestamp del file cambia. questo non significa che l’applicazione di scrittura ha chiuso il file. se il file non è chiuso, non sarà in grado di leggerlo. la strategia esatta dipende dal programma che scrive il file. nel caso più semplice, un System.Threading.Thread.Sleep() può bastare

Leave a Reply

Your email address will not be published. Required fields are marked *