Pemberitahuan ketika file berubah?

112

Apakah ada mekanisme dimana saya dapat diberitahu (dalam C #) ketika file diubah pada disk?

PaulB
sumber
1
Lihat jawaban ini untuk informasi lebih lanjut tentang kelas FileSystemWatcher dan kejadian yang dimunculkan.
ChrisF

Jawaban:

205

Anda dapat menggunakan FileSystemWatcherkelas.

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
sumber
11
Terima kasih atas contoh yang bagus. Saya juga akan menunjukkan bahwa Anda dapat menggunakan metode WaitForChanged di FileSystemWatcher jika Anda mencari cara pemblokiran (sinkron) untuk melihat perubahan.
Mark Meuer
22
Terima kasih untuk contoh ini. MSDN hampir sama di sini . Juga, beberapa orang mungkin ingin melihat seluruh pohon direktori - gunakan watcher.IncludeSubdirectories = true;untuk mencapai itu.
Oliver
1
OnChangekebakaran tanpa perubahan aktual ( misal: memukul ctrl+stanpa perubahan aktual ), adakah cara untuk mendeteksi perubahan palsu?
Mehdi Dehghani
1
@MehdiDehghani: Setahu saya tidak, satu-satunya cara tampaknya benar-benar menyimpan snapshot file dan membandingkan byte-bijaksana dengan versi saat ini (mungkin berubah). Satu- FileSystemWatchersatunya yang dapat mendeteksi peristiwa di tingkat sistem file (yaitu jika OS memicu peristiwa). Dalam kasus Anda Ctrl + S memicu kejadian seperti itu (apakah itu terjadi atau tidak tergantung pada aplikasi sebenarnya).
Dirk Vollmar
Apakah FileSystemWatcher bersifat lintas platform?
Vinigas
5

Gunakan FileSystemWatcher. Anda hanya dapat memfilter untuk acara modifikasi.

Shea
sumber