Проблемы с FileSystemWatcher
Я пытаюсь использовать FileSystemWatcher - и мне повезло...
Цель состоит в том, чтобы переместить созданный файл из отслеживаемой папки в новую папку.
Но... ударил 2 загвоздки. Во-первых, если я перемещаю 3 файла в папку одновременно (выберите 3 файла, Ctrl+ X, а затем Ctrl+ C в мою папку монитора), монитор запускается только для первого файла. Другие 2 не обрабатываются.
FileSystemWatcher fsw = new FileSystemWatcher(FolderToMonitor);
fsw.Created += new FileSystemEventHandler(fsw_Created);
bool monitor = true;
while (monitor)
{
fsw.WaitForChanged(WatcherChangeTypes.All, 2000);
if (Console.KeyAvailable)
{
monitor = false;
}
}
Show("User has quit the process...", ConsoleColor.Yellow);
Console.ReadKey();
Есть ли способ заставить его увидеть все 3?
Во-вторых, если я перемещаю файл в папку монитора с другого диска, копирование файла в папку занимает несколько секунд. Тем не менее, монитор срабатывает, как только файл начинает копироваться в..., поэтому он доступен только для чтения и не готов к перемещению.
Можно ли подождать, пока файл завершит копирование в папку монитора, прежде чем я обработаю его?
1 ответ
Согласно документации MSDN:
Операционная система Windows уведомляет ваш компонент об изменениях файлов в буфере, созданном FileSystemWatcher. Если за короткое время произойдет много изменений, буфер может переполниться. Это приводит к тому, что компонент теряет отслеживание изменений в каталоге, и он будет предоставлять только общее уведомление. Увеличение размера буфера с помощью свойства InternalBufferSize является дорогостоящим, так как оно поступает из невыгружаемой памяти, которую нельзя выгружать на диск, поэтому сохраняйте буфер как небольшой, но достаточно большой, чтобы не пропустить какие-либо события изменения файла. Чтобы избежать переполнения буфера, используйте свойства NotifyFilter и IncludeSubdirectories, чтобы можно было отфильтровывать нежелательные уведомления об изменениях.
Возможно, это объясняет вашу проблему?
Также обратите внимание, что вырезание и вставка файлов из одного каталога в другой - это в основном простая операция переименования, поэтому вы должны использовать Renamed
событие, чтобы обнаружить их.
Что касается вашей другой проблемы: попробуйте использовать Changed
событие вместе с Created
Я полагаю, что оба файла будут вызваны ровно один раз для файла (обратите внимание, что перемещение файла с другого диска не является простой операцией переименования: это копирование и удаление), поэтому Changed
событие должно указывать, когда операция копирования файла была завершена (т.е. она не будет запущена, пока файл не будет завершен).