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.