Использование FileSystemWatcher для мониторинга каталога
Я использую приложение Windows Forms для мониторинга каталога и перемещения файлов, упавших в него, в другой каталог.
На данный момент он скопирует файл в другой каталог, но когда будет добавлен другой файл, он просто не закончит сообщение об ошибке. Иногда он копирует два файла до окончания третьего.
Это потому, что я использую приложение Windows Form, а не консольное приложение? Есть ли способ, по которому я могу остановить программу, и продолжать следить за каталогом?
- Как я могу исправить приложение Windows .NET при запуске с кодом исключения: 0xE0434352?
- Открыть изображение из файла, затем отпустить блокировку?
- Решить перекрестное streamовое исключение в WinForms
- Включить Entity Framework 6 для MySql (C #) в WinForms Microsoft Visual Studio 2013
- Как вы имитируете Mouse Click на C #?
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. }
- Могу ли я разместить Windows Form внутри элемента управления
- Доступ к управлению пользовательским интерфейсом из BackgroundWorker Thread
- Добавьте несколько изображений в тело электронной почты (inline) с помощью приложения windows c #
- Введите символ «&» в текстовую метку в Windows Forms?
- Как получить доступ к элементу управления из статического метода?
- Обнаружение, если событие вставки произошло в расширенном текстовом поле
- Лучший способ получить доступ к элементу управления в другой форме в Windows Forms?
- Открыть окно WPF в WindowsForm APP
Проблема связана с фильтрами уведомлений. Программа пыталась открыть файл, который все еще копировал. Я удалил все уведомления, кроме 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. }