Использование FileSystemWatcher для мониторинга каталога


Я использую приложение Windows Forms для мониторинга каталога и перемещения файлов, помещенных в него, в другой каталог.

в данный момент он скопирует файл в другой каталог, но когда будет добавлен другой файл, он просто закончится без сообщения об ошибке. Иногда он копирует два файла прежде, чем закончить на третьем.

это потому, что я использую приложение Windows Form, а не консольное приложение? Есть ли способ остановить программу от завершения и сохранить следишь за справочником?

private void watch()
{
  FileSystemWatcher watcher = new FileSystemWatcher();
  watcher.Path = path;
  watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
                         | NotifyFilters.FileName | NotifyFilters.DirectoryName;
  watcher.Filter = "*.*";
  watcher.Changed += new FileSystemEventHandler(OnChanged);
  watcher.EnableRaisingEvents = true;
}

private void OnChanged(object source, FileSystemEventArgs e)
{
  //Copies file to another directory.
}
3 73

3 ответа:

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

private void watch()
{
  FileSystemWatcher watcher = new FileSystemWatcher();
  watcher.Path = path;
  watcher.NotifyFilter = NotifyFilters.LastWrite;
  watcher.Filter = "*.*";
  watcher.Changed += new FileSystemEventHandler(OnChanged);
  watcher.EnableRaisingEvents = true;
}

вы не предоставили код обработки файлов, но я предполагаю, что вы сделали ту же ошибку, что и все, когда впервые пишете такую вещь: событие filewatcher будет вызвано, как только файл будет создан. Однако для завершения работы с файлом потребуется некоторое время. Возьмем, к примеру, файл размером 1 ГБ. Файл может быть создан другой программой (Explorer.exe копирование его откуда-то), но это займет несколько минут, чтобы закончить этот процесс. Событие возникает во время создания, и вам нужно подождать чтобы файл был готов к копированию.

можно подождать, пока файл будет готов, с помощью этой

причина может быть в том, что watcher объявляется как локальная переменная для метода, и это мусор, собранный по завершении метода. Вы должны объявить его как члена класса. Попробуйте следующее:

FileSystemWatcher watcher;

private void watch()
{
  watcher = new FileSystemWatcher();
  watcher.Path = path;
  watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
                         | NotifyFilters.FileName | NotifyFilters.DirectoryName;
  watcher.Filter = "*.*";
  watcher.Changed += new FileSystemEventHandler(OnChanged);
  watcher.EnableRaisingEvents = true;
}

private void OnChanged(object source, FileSystemEventArgs e)
{
  //Copies file to another directory.
}