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:

csharp
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:

text
Created: lapor.txt
Created: baru.txt
Pemantauan berhenti setelah batas waktu 1 detik

Mari kita bedah baris demi baris:

  1. CancellationTokenSource(TimeSpan.FromSeconds(1)): menyiapkan pembatalan otomatis satu detik kemudian, sehingga pemantauan tidak berjalan selamanya.
  2. Filter = "*.txt" dan EnableRaisingEvents = true: hanya berkas teks yang dilaporkan, dan pemantauan resmi dinyalakan.
  3. pengawas.Created += ...: setiap kejadian pembuatan berkas dicatat bersama ChangeType dan nama berkasnya.
  4. Dua File.WriteAllText dengan jeda: menulis lapor.txt lalu baru.txt selama watcher aktif; Task.Delay yang menerima token melempar OperationCanceledException saat batas waktu tercapai, dan blok catch menangkapnya.
  5. Perulangan akhir: mencatat kejadian dicetak setelah pemantauan berhenti.