Powiadomienie o zmianie pliku?

113

Czy istnieje mechanizm, za pomocą którego mogę być powiadamiany (w języku C #) o zmodyfikowaniu pliku na dysku?

PaulB
źródło
1
Zobacz tę odpowiedź, aby uzyskać więcej informacji na temat klasy FileSystemWatcher i wywoływanych przez nią zdarzeń.
ChrisF

Odpowiedzi:

206

Możesz skorzystać z FileSystemWatcherklasy.

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
źródło
11
Dzięki za miły przykład. Zwrócę również uwagę, że możesz użyć metody WaitForChanged na FileSystemWatcher, jeśli szukasz blokującego (synchronicznego) sposobu obserwowania zmian.
Mark Meuer,
22
Dzięki za ten przykład. MSDN ma niemal tak samo tutaj . Ponadto niektórzy ludzie mogą chcieć obejrzeć całe drzewo katalogów - użyj, watcher.IncludeSubdirectories = true;aby to osiągnąć.
Oliver
1
OnChangepożary bez rzeczywistej zmiany ( np. uderzenie ctrl+sbez żadnej rzeczywistej zmiany ), czy istnieje sposób na wykrycie fałszywych zmian?
Mehdi Dehghani
1
@MehdiDehghani: Nie żebym o tym wiedział, jedynym sposobem wydaje się być faktyczne zachowanie migawki pliku i porównanie tego bajtu z bieżącą (prawdopodobnie zmienioną) wersją. FileSystemWatcherTylko jest w stanie wykryć zdarzeń na poziomie systemu plików (czyli, czy system operacyjny uruchamia zdarzenie). W twoim przypadku Ctrl + S wyzwala takie zdarzenie (czy tak się stanie, czy nie, zależy jednak od rzeczywistej aplikacji).
Dirk Vollmar
Czy FileSystemWatcher jest wieloplatformowy?
Vinigas
5

Użyj FileSystemWatcher. Możesz filtrować tylko dla zdarzeń modyfikacji.

Shea
źródło