¿Notificación cuando cambia un archivo?

111

¿Existe algún mecanismo mediante el cual se me pueda notificar (en C #) cuando se modifica un archivo en el disco?

PaulB
fuente
1
Consulte esta respuesta para obtener más información sobre la clase FileSystemWatcher y los eventos que genera.
ChrisF

Respuestas:

204

Puedes usar la FileSystemWatcherclase.

public void CreateFileWatcher(string path)
{
    // Create a new FileSystemWatcher and set its properties.
    FileSystemWatcher watcher = new FileSystemWatcher();
    watcher.Path = path;
    /* Watch for changes in LastAccess and LastWrite times, and 
       the renaming of files or directories. */
    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
       | NotifyFilters.FileName | NotifyFilters.DirectoryName;
    // Only watch text files.
    watcher.Filter = "*.txt";

    // Add event handlers.
    watcher.Changed += new FileSystemEventHandler(OnChanged);
    watcher.Created += new FileSystemEventHandler(OnChanged);
    watcher.Deleted += new FileSystemEventHandler(OnChanged);
    watcher.Renamed += new RenamedEventHandler(OnRenamed);

    // Begin watching.
    watcher.EnableRaisingEvents = true;
}

// Define the event handlers.
private static void OnChanged(object source, FileSystemEventArgs e)
{
    // Specify what is done when a file is changed, created, or deleted.
   Console.WriteLine("File: " +  e.FullPath + " " + e.ChangeType);
}

private static void OnRenamed(object source, RenamedEventArgs e)
{
    // Specify what is done when a file is renamed.
    Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
}
Dirk Vollmar
fuente
11
Gracias por el buen ejemplo. También señalaré que puede usar el método WaitForChanged en FileSystemWatcher si está buscando una forma de bloqueo (sincrónica) para observar los cambios.
Mark Meuer
22
Gracias por este ejemplo. El MSDN tiene prácticamente lo mismo aquí . Además, algunas personas pueden querer ver un árbol de directorios completo; utilícelo watcher.IncludeSubdirectories = true;para lograrlo.
Oliver
1
OnChangeincendios sin cambios reales ( por ejemplo: golpear ctrl+ssin cambios reales ), ¿hay alguna forma de detectar cambios falsos?
Mehdi Dehghani
1
@MehdiDehghani: No que yo sepa, la única forma parece ser realmente mantener una instantánea del archivo y comparar ese byte con la versión actual (presumiblemente modificada). El FileSystemWatcherúnico es capaz de detectar eventos a nivel del sistema de archivos (es decir, si el sistema operativo desencadena un evento). En su caso, Ctrl + S desencadena un evento de este tipo (aunque eso suceda o no depende de la aplicación real).
Dirk Vollmar
¿FileSystemWatcher es multiplataforma?
Vinigas
5

Utilice el FileSystemWatcher. Puede filtrar solo por eventos de modificación.

Ella a
fuente