Benachrichtigung, wenn sich eine Datei ändert?

111

Gibt es einen Mechanismus, mit dem ich benachrichtigt werden kann (in C #), wenn eine Datei auf der Disc geändert wird?

PaulB
quelle
1
In dieser Antwort finden Sie weitere Informationen zur FileSystemWatcher-Klasse und den von ihr ausgelösten Ereignissen.
ChrisF

Antworten:

203

Sie können die FileSystemWatcherKlasse verwenden.

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
quelle
11
Danke für das schöne Beispiel. Ich werde auch darauf hinweisen, dass Sie die Methode WaitForChanged in FileSystemWatcher verwenden können, wenn Sie nach einer blockierenden (synchronen) Methode suchen, um nach Änderungen zu suchen.
Mark Meuer
22
Danke für dieses Beispiel. Die MSDN hat so ziemlich das gleiche hier . Einige Leute möchten vielleicht auch einen ganzen Verzeichnisbaum sehen - verwenden Sie watcher.IncludeSubdirectories = true;, um dies zu erreichen.
Oliver
1
OnChangeBrände ohne tatsächliche Änderung ( z. B. Schlagen ctrl+sohne tatsächliche Änderung ). Gibt es eine Möglichkeit, gefälschte Änderungen zu erkennen?
Mehdi Dehghani
1
@MehdiDehghani: Nicht dass ich wüsste, der einzige Weg scheint darin zu bestehen, tatsächlich einen Schnappschuss der Datei zu führen und diesen byteweise mit der aktuellen (vermutlich geänderten) Version zu vergleichen. Der FileSystemWatchereinzige ist in der Lage, Ereignisse auf Dateisystemebene zu erkennen (dh wenn das Betriebssystem ein Ereignis auslöst). In Ihrem Fall löst Strg + S ein solches Ereignis aus (ob dies geschieht oder nicht, hängt jedoch von der tatsächlichen Anwendung ab).
Dirk Vollmar
Ist FileSystemWatcher plattformübergreifend?
Vinigas
5

Verwenden Sie die FileSystemWatcher. Sie können nur nach Änderungsereignissen filtern.

Shea
quelle