Beberapa program perlu bereaksi begitu berkas berubah: alat build yang mengompilasi ulang kode, folder unduhan yang memproses berkas baru, atau berkas konfigurasi yang dimuat ulang. Memeriksa isi folder berulang kali (polling) memboroskan sumber daya. FileSystemWatcher menawarkan jalan yang lebih efisien: sistem operasi yang memberi tahu program ketika kejadian terjadi.
Cara FileSystemWatcher Bekerja #
Kita menunjuk folder yang dipantau lewat constructor, menyaring tipe berkas lewat properti Filter, lalu berlangganan kejadian seperti Created, Changed, Deleted, dan Renamed. Properti NotifyFilter menentukan atribut apa yang dianggap perubahan, misalnya nama berkas, ukuran, atau waktu tulis terakhir. Properti EnableRaisingEvents harus bernilai true; tanpa itu tidak ada satu pun kejadian yang dikirim. Pada contoh kita, CancellationTokenSource dengan batas waktu satu detik menghentikan pemantauan sehingga program berakhir dengan sendirinya.
Contoh Memantau Pembuatan Berkas #
Contoh berikut memantau folder, menulis dua berkas selama pemantauan berjalan, lalu mencetak kejadian yang tertangkap. Kejadian ditampung ke daftar terlebih dahulu dan dicetak setelah pemantauan berhenti, agar pencetakan tidak bercampur dengan proses penulisan berkas:
string dir = Path.Combine(Path.GetTempPath(), "verify-6c", "file-watcher");
Directory.CreateDirectory(dir);
using CancellationTokenSource sumberBatal =
new CancellationTokenSource(TimeSpan.FromSeconds(1));
using FileSystemWatcher pengawas = new FileSystemWatcher(dir) { Filter = "*.txt" };
pengawas.EnableRaisingEvents = true;
List<string> kejadian = new();
pengawas.Created += (pengirim, e) => kejadian.Add($"{e.ChangeType}: {e.Name}");
File.WriteAllText(Path.Combine(dir, "lapor.txt"), "isi awal");
await Task.Delay(200, sumberBatal.Token);
File.WriteAllText(Path.Combine(dir, "baru.txt"), "file kedua");
try
{
await Task.Delay(800, sumberBatal.Token);
}
catch (OperationCanceledException)
{
// batas waktu 1 detik tercapai, pemantauan dihentikan
}
foreach (string k in kejadian)
{
Console.WriteLine(k);
}
Console.WriteLine("Pemantauan berhenti setelah batas waktu 1 detik");Output yang Dihasilkan:
Created: lapor.txt
Created: baru.txt
Pemantauan berhenti setelah batas waktu 1 detikMari kita bedah baris demi baris:
CancellationTokenSource(TimeSpan.FromSeconds(1)): menyiapkan pembatalan otomatis satu detik kemudian, sehingga pemantauan tidak berjalan selamanya.Filter = "*.txt"danEnableRaisingEvents = true: hanya berkas teks yang dilaporkan, dan pemantauan resmi dinyalakan.pengawas.Created += ...: setiap kejadian pembuatan berkas dicatat bersamaChangeTypedan nama berkasnya.- Dua
File.WriteAllTextdengan jeda: menulislapor.txtlalubaru.txtselama watcher aktif;Task.Delayyang menerima token melemparOperationCanceledExceptionsaat batas waktu tercapai, dan blokcatchmenangkapnya. - Perulangan akhir: mencatat kejadian dicetak setelah pemantauan berhenti.