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

Другие вопросы по тегам