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

4

у меня естьFileSystemWatcher что я хотел бы уволитьOnCreated event for every folder copied into the watched directory, Несколько папок будут скопированы в этот каталог для просмотра одновременно, вручную.

В настоящее время это только стрельбаevent для первой папки скопированы.
Поэтому, если я просматриваю папку 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); 
}

Любая идеяwhy this is only firing the event for the first folder скопировать в просматриваемый каталог?

Ваш Ответ

1   ответ
10

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

The Windows operating system notifies your component of file changes in a buffer created by the FileSystemWatcher. If there are many changes in a short time, the buffer can overflow. This causes the component to lose track of changes in the directory, and it will only provide blanket notification. Increasing the size of the buffer with the InternalBufferSize property is expensive, as it comes from non-paged memory that cannot be swapped out to disk, so keep the buffer as small yet large enough to not miss any file change events. To avoid a buffer overflow, use the NotifyFilter and IncludeSubdirectories properties so you can filter out unwanted change notifications.

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

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

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

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