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

Проблема связана с фильтрами уведомлений. Программа пыталась открыть файл, который все еще копировал. Я удалил все уведомления, кроме 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 копирует ее откуда-то), но для завершения этого процесса потребуется несколько минут. Событие возникает во время создания, и вам нужно дождаться, когда файл будет готов к копированию.

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

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

 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. } 
  • Вызвать метод из другой формы
  • Получить текущий путь к папке
  • Получить значок файла, используемый Shell
  • Доступ к элементам управления пользовательским интерфейсом в Task.Run с помощью async / wait на WinForms
  • показать форму windows из windows службы
  • Как отключить форму закрытия Alt + F4?
  • как я могу показать сумму в столбце datagridview?
  • Цвет отдельных элементов в winforms ComboBox?
  • Как включить второй монитор в C #?
  • UI Design Pattern для Windows Forms (например, MVVM для WPF)
  • Как заставить WinForms молча игнорировать необработанные исключения?
  • Interesting Posts

    Какова область по умолчанию для рабочих листов и ячеек и диапазона?

    С Linux iptables можно ли зарегистрировать имя процесса / команды, которое инициирует исходящее соединение?

    Как я могу выровнять меню / значки панели инструментов Android слева, как в приложении «Карты Google»?

    Откройте диалоговое окно файла и выберите файл с помощью элементов управления WPF и C #

    Как обрабатываются пароли Windows?

    Контроллер JavaFX FXML – конструктор против метода инициализации

    Сделайте снимок экрана прокручивающегося окна, которое включает в себя части экрана

    Номер строки C / C ++

    Как я могу запустить скрипт каждый день в Mac OS X?

    Как работает побитовая и (И) на Java?

    Замените отсутствующие значения средним значением – Spark Dataframe

    Загрузите файл в SharePoint через встроенные веб-службы

    Как получить x и y windows программы на Java?

    getRunningTasks не работает в Android L

    Как создать изображение из текста на лету во время выполнения

    Давайте будем гением компьютера.