несколько FileSystemWatchers для мониторинга файлов в локальной системе? - PullRequest
2 голосов
/ 29 мая 2010

Мы пишем текстовый редактор, похожий на инструмент для нашей внутренней системы бухгалтерских пакетов, в котором есть действия, которые могут быть выполнены нашими собственными спецификациями языка Xml. Эти макрокоманды указаны в файлах Xml, и нам нужна возможность отслеживать, были ли открытые файлы изменены внешне.

Единственная проблема в том, что может быть открыто 20-30 файлов с разными путями одновременно. Было бы хорошо использовать несколько FileSystemWatchers для этого сценария? Или лучше отслеживать корневой диск и отлавливать определенные события, которые соответствуют открытому файлу в редакторе (хотя может возникнуть много событий).

Некоторые являются локальными дисками (C, D, E), другие являются их сетевыми дисками (U, X, G, H). Файлы слишком короткие, около 300-400 Кб.

Ответы [ 2 ]

1 голос
/ 29 мая 2010

Сначала несколько фактов

1 - FileSystemWatcher - это оболочка для ReadDirectoryChanges
2- ReadDirectoryChanges создает буфер ядра для кэширования события из памяти невыгружаемого пула для каждого вызова ReadDirectoryChanges

Смысл пункта 2 выше заключается в том, что каждый экземпляр FileSystemWatcher будет выделять память из невыгружаемого пула. Помните, что это память, используемая для драйверов режима ядра и т. Д., И хотя она может динамически расширяться, она «жестко» ограничена максимальным размером, рассчитанным во время загрузки на основе ресурсов вашей системы (сколько памяти имеет машина ).

Итак, учитывая вышесказанное, я бы рассмотрел следующее.

Если объем изменений вы ожидаете увидеть. Если оно низкое, выберите несколько наблюдателей с наименьшим размером буфера, с которым вы можете обойтись.

Также имейте в виду, что если вы решите использовать большие буферы, мониторинг сетевых дисков не поддерживает размеры буферов более 64 КБ, больше этого, и вы не получите события.

0 голосов
/ 29 мая 2010

Я думаю, вам почти наверняка понадобятся несколько наблюдателей. Буфер FileSystemWatcher s может переполниться, в противном случае вы можете пропустить события, вы можете изменить размер буфера (используя InternalBufferSize), но только до 64 КБ.

Однако, имейте в виду, что FileSystemWatcher использует FindFirstChangeNotification, что не совсем надежно для сетевых накопителей (особенно если под большой нагрузкой, но, возможно, и в других случаях), поэтому вы должны ожидать и планировать, что вы не будете получать каждый событие из сети, и я понимаю, что надежность становится еще хуже, если у вас есть несколько наблюдателей.

Итак, в заключение, я думаю, вам придется увеличить буферы, отфильтровать как можно больше, а затем использовать как можно меньше наблюдателей без переполнения буферов, так что, вероятно, придется немного пробовать и ошибаться, чтобы поймите правильно.

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