Подтвердить что ты не робот

Использование 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.
}
4b9b3361

Ответ 1

Проблема заключалась в фильтрах уведомлений. Программа пыталась открыть файл, который все еще копировал. Я удалил все фильтры уведомлений, кроме 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;
}

Ответ 2

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

Вы можете подождать, пока файл будет готов, используя эту функцию в цикле.

Ответ 3

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

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.
}