2009-04-06 18 views
78

¿Hay algún mecanismo por el cual se me pueda notificar (en C#) cuando se modifica un archivo en el disco?¿Notificación cuando cambia un archivo?

+1

3 respuestas al mismo tiempo. –

+1

Consulte esta [respuesta] (http://stackoverflow.com/questions/381976/handling-multiple-change-events-in-filesystemwatcher/382996#382996) para obtener más información sobre la clase FileSystemWatcher y los eventos que genera. – ChrisF

Respuesta

5

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

139

Puede usar la clase FileSystemWatcher.

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

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. –

+13

Gracias por este ejemplo. MSDN tiene más o menos lo mismo [aquí] (http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.filter%28v=vs.100%29.aspx). Además, algunas personas pueden querer ver un árbol de directorios completo: use 'watcher.IncludeSubdirectories = true;' para lograr eso. – Oliver

Cuestiones relacionadas