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