Проблемы FileSystemWatcher - PullRequest
       1

Проблемы FileSystemWatcher

2 голосов
/ 14 мая 2011

Я пытаюсь использовать 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 Ответ

2 голосов
/ 14 мая 2011

Согласно документации msdn :

Операционная система Windows уведомляет ваш компонент об изменениях файла в буфере, созданном FileSystemWatcher.Если за короткое время произойдет много изменений, буфер может переполниться.Это приводит к тому, что компонент теряет отслеживание изменений в каталоге, и он будет предоставлять только общее уведомление.Увеличение размера буфера с помощью свойства InternalBufferSize является дорогостоящим, так как оно поступает из невыгружаемой памяти, которую нельзя выгружать на диск, поэтому сохраняйте буфер как небольшой, но достаточно большой, чтобы не пропустить какие-либо события изменения файла.Чтобы избежать переполнения буфера, используйте свойства NotifyFilter и IncludeSubdirectories, чтобы вы могли отфильтровывать нежелательные уведомления об изменениях.

Возможно, это объясняет вашу проблему?
Также обратите внимание, что вырезание и вставка файлов из одного каталога вдругая - в основном простая операция переименования, поэтому вы должны использовать событие Renamed для их обнаружения.

Что касается вашей другой проблемы: попробуйте использовать событие Changed вместе с Created, так как я считаю, что обабудет вызван ровно один раз для файла (обратите внимание, что перемещение файла с другого диска не является простой операцией переименования: это копирование и удаление), поэтому событие Changed должно указывать, когда операция копирования файла была завершена (т.е. она выигралане запускается, пока файл не будет завершен).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...