Powiadomienie o zmianie pliku?


113

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


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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.