Наблюдение FileSystemWatcher в C#
Наблюдатель FileSystemWatcher вызывает обработчики из фонового потока. Событие приходит после записи на диск, поэтому ждут сигнал. Короткой паузы для этого мало.
Подпишемся на Created и Changed, включим EnableRaisingEvents и дождемся сигнала через ManualResetEventSlim. Фильтр NotifyFilter оставляет смену имени и смену времени записи. В seen попадает имя из первого события, повторное Changed его не затирает. Без ожидания seen часто остаётся пустым, потому что событие может прийти с задержкой:
string dir = Path.Combine(Path.GetTempPath(), "watch-" + Guid.NewGuid().ToString("N"));
Directory.CreateDirectory(dir);
using ManualResetEventSlim signal = new ManualResetEventSlim(false);
string seen = "";
using (FileSystemWatcher watcher = new FileSystemWatcher(dir))
{
watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite;
watcher.Created += (_, e) =>
{
seen = e.Name ?? "";
signal.Set();
};
watcher.Changed += (_, e) =>
{
if (seen.Length == 0)
{
seen = e.Name ?? "";
signal.Set();
}
};
watcher.EnableRaisingEvents = true;
File.WriteAllText(Path.Combine(dir, "evt.txt"), "payload");
signal.Wait(TimeSpan.FromSeconds(5));
}
Console.WriteLine(seen); // выведет "evt.txt"
Directory.Delete(dir, true);
Наблюдайте за каталогом spool, создайте в нем файл job.txt с текстом ready и выведите True, если имя из события совпало с job.txt.