Notifica quando un file cambia?


113

Esiste un meccanismo tramite il quale posso essere avvisato (in C #) quando un file viene modificato sul disco?


1
Vedi questa risposta per ulteriori informazioni sulla classe FileSystemWatcher e sugli eventi che genera.
ChrisF

Risposte:



206

Puoi usare la FileSystemWatcherclasse.

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

11
Grazie per il bell'esempio. Sottolineo anche che puoi usare il metodo WaitForChanged su FileSystemWatcher se stai cercando un modo di blocco (sincrono) per guardare le modifiche.
Mark Meuer

22
Grazie per questo esempio. L'MSDN ha più o meno lo stesso qui . Inoltre, alcune persone potrebbero voler guardare un intero albero di directory: usalo watcher.IncludeSubdirectories = true;per farlo.
Oliver

1
OnChangesi attiva senza modifiche effettive ( ad esempio: colpire ctrl+ssenza modifiche effettive ), esiste un modo per rilevare modifiche false?
Mehdi Dehghani

1
@MehdiDehghani: Non che io sappia, l'unico modo sembra essere quello di mantenere effettivamente un'istantanea del file e confrontare quel byte per byte con la versione corrente (presumibilmente modificata). L' FileSystemWatcherunico è in grado di rilevare eventi a livello di file system (cioè se il sistema operativo attiva un evento). Nel tuo caso Ctrl + S innesca un tale evento (se ciò accada o meno dipende dall'applicazione effettiva).
Dirk Vollmar

FileSystemWatcher è multipiattaforma?
Vinigas

5

Usa il FileSystemWatcher. Puoi filtrare solo per eventi di modifica.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.