FileSystemWatcher не уведомляет об удалении самого каталога пути - PullRequest
3 голосов
/ 09 января 2020

Я использую FileSystemWatcher в своем коде, чтобы отслеживать любые изменения / переименования / добавления файла в контролируемой директории. Теперь мне нужно уведомление, если отслеживаемый каталог будет удален.

Есть предложения, как этого добиться?

Я пытался добавить второго наблюдателя в родительский каталог (C:\temp\subfolder1 в приведенном ниже примере) и отфильтровать события по полному пути отслеживаемого каталога (C:\temp\subfolder1\subfolder2).

Но это не будет работать, если удаление выполняется на уровне каталога выше, и я не хочу отслеживать всю файловую систему. В приведенном ниже примере она должна срабатывать и при удалении C:\temp, а не только при удалении C:\temp\subfolder1.

  class Program
  {
    static void Main(string[] args)
    {
      FileSystemWatcher watcher = new FileSystemWatcher();
      watcher.Path = @"C:\temp\subfolder1\subfolder2";
      watcher.EnableRaisingEvents = true;

      watcher.Changed += OnChanged;
      watcher.Created += OnChanged;
      watcher.Deleted += OnChanged;
      watcher.Renamed += OnChanged;

      Console.ReadLine();
    }

    private static void OnChanged(object sender, FileSystemEventArgs e)
    {
      Console.WriteLine(e.FullPath);
    }
  }

Ответы [ 2 ]

5 голосов
/ 09 января 2020

Вы можете подписаться на событие FileSystemWatcher.Error. Это сработает, когда родительский каталог будет удален. Затем вы можете выполнить соответствующие проверки, чтобы выяснить, не вызвано ли это удалением папки.

0 голосов
/ 09 января 2020

@ crankedreli c Спасибо за помощь! Чтобы получить оба случая удаления (навсегда и переместить в корзину), мне нужно использовать этот код:

private static void OnError(object sender, ErrorEventArgs e)
{
  Exception ex = e.GetException();
  if (ex is Win32Exception && (((Win32Exception)ex).NativeErrorCode == 5))
  {
    Console.WriteLine($"Directory deleted permanently: { watcher.Path }");
  }
}

private static void OnChanged(object sender, FileSystemEventArgs e)
{
  if (!Directory.Exists(watcher.Path))
  {
    Console.WriteLine($"Directory deleted (recycle bin): { watcher.Path }");
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...