Bir dosya değiştiğinde bildirim?


113

Diskte bir dosya değiştirildiğinde bildirim alabileceğim (C # ile) bir mekanizma var mı?


1
FileSystemWatcher sınıfı ve bu sınıfın oluşturduğu olaylar hakkında daha fazla bilgi için bu yanıta bakın .
ChrisF

Yanıtlar:



206

FileSystemWatcherSınıfı kullanabilirsiniz .

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
Güzel örnek için teşekkürler. Değişiklikleri izlemenin engelleyici (eşzamanlı) bir yolunu arıyorsanız, FileSystemWatcher üzerinde WaitForChanged yöntemini kullanabileceğinizi de belirteceğim.
Mark Meuer

22
Bu örnek için teşekkürler. MSDN'de hemen hemen aynı şey var . Ayrıca, bazı kişiler bütün bir dizin ağacını izlemek isteyebilir - watcher.IncludeSubdirectories = true;bunu başarmak için kullanın .
Oliver

1
OnChangefiili değişiklik olmadan yangınlar ( örneğin: ctrl+sgerçek bir değişiklik olmadan isabet ), sahte değişiklikleri tespit etmenin herhangi bir yolu var mı?
Mehdi Dehghani

1
@MehdiDehghani: Bildiğim kadarıyla değil, tek yol dosyanın anlık görüntüsünü saklamak ve bu bayt bazında mevcut (muhtemelen değiştirilmiş) sürümle karşılaştırmak gibi görünüyor. FileSystemWatcherSadece (yani OS bir olay tetikler varsa) dosya sistemi düzeyinde olaylarını tespit edebiliyor. Sizin durumunuzda Ctrl + S böyle bir olayı tetikler (bunun gerçekleşip gerçekleşmemesi gerçek uygulamaya bağlıdır).
Dirk Vollmar

FileSystemWatcher çapraz platform mu?
Vinigas

5

Kullanın FileSystemWatcher. Yalnızca değişiklik olaylarını filtreleyebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.