Вопрос по .net, filesystemwatcher, c# – FileSystemWatcher OnСоздал только запуск для первого файла из нескольких скопированных файлов

4

у меня естьFileSystemWatcher что я хотел бы уволитьOnCreated event для каждой папки, скопированной в просматриваемый каталог, Несколько папок будут скопированы в этот каталог для просмотра одновременно, вручную.

В настоящее время это только стрельбаevent для первой папки скопированы.

Так что если яm просматривает папку X и выбирает папки A, B, C в проводнике Windows и копирует их в X,OnCreated уволен за А, но не за В или С.

Это мой код, который яиспользуя для настройки:FileSystemWatcher

watcher = new System.IO.FileSystemWatcher(watchPath);            
watcher.InternalBufferSize = 32768;
watcher.IncludeSubdirectories = true;
watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName | 
                       NotifyFilters.CreationTime | NotifyFilters.LastWrite;


watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnCreated);
watcher.EnableRaisingEvents = true;

а вот мойOnCeated метод

void OnCeated(object sender, FileSystemEventArgs e)
{            
    XDocument xmlDoc = BeginImport(e.FullPath); 
}

Любая идеяпочему это только запуск события для первой папки скопировать в просматриваемый каталог?

Ваш Ответ

1   ответ
10

Отдокументация:

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

Это кажется внутренним ограничением.

Я считаю, что акт вставки всех трех папок считается "много изменений за короткое время - можете ли вы использоватьNotifyFilter и пропустить некоторые события?

Также может быть полезно создать свой собственный буфер; иметь параллельную очередь, которую вы добавляете при получении уведомления, а затем воздействуете на эту очередь позже. Поскольку работа, которую вы хотите выполнить на основе изменений файла, занимает больше времени, чем работа по добавлению объекта, представляющего его в очередь (что очень часто происходит), это снижает вероятность пропущенных изменений файла. Jon Hanna
+1 @ELG может отслеживать дату последнего обработанного файла, а затем обрабатывать любые файлы с датой gt. paparazzo
Вот и все, спасибо! Я установил максимальный допустимый размер буфера (64 КБ), отключил включение подкаталогов и отфильтровал только для CreationTime и DirectoryName, и он обрабатывает не менее 50 каталогов одновременно. ELG

Похожие вопросы