2011-01-31 4 views
5

Я ищу надежный способ поиска изменений в каталоге.Надежный способ мониторинга изменений файлов в каталоге с использованием .NET framework

Я попытался использовать FileSystemWatcher, но это довольно неточно, когда многие маленькие файлы создаются, изменяются или удаляются. В моих тестах он пропускает около 1 или 2% файлов. Это довольно много, когда вы быстро добавляете или меняете тысячи файлов.

Я пробовал опрос для изменений с разными интервалами 500 мс, 2000 мс и т. Д. В этом случае я получаю слишком много хитов. Это может иметь какое-то отношение к разрешению временных меток в объекте FileInfo.

Так что мой вопрос; возможно ли, используя .NET Framework, надежно получить изменения в каталоге?

- Christian

ответ

7

Вы пытались увеличить InternalBufferSize? Какой размер вы его установили?

От MSDN:


Обратите внимание, что FileSystemWatcher может пропустить событие, когда размер буфера превышен. Чтобы избежать пропущенных событий, следуйте этим рекомендациям: Увеличьте размер буфера , установив свойство InternalBufferSize 10. Избегайте просмотра файлов с длинными именами файлов, , потому что длинное имя файла вносит в заполнение буфера. Рассмотрим , переименовав эти файлы, используя короткие имена .


Держите обработки событий код как можно короче.

+0

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

4

Да, собственно мониторинг выполняется с помощью драйвера файловой системы фильтра. Такой драйвер перехватывает все запросы, поступающие в файловую систему сразу же после их отправки (до или после того, как они доходят до файловой системы). Таким образом вы получаете все уведомления, своевременно (или даже до возникновения события), и вы можете контролировать, какие запросы проходят и какая информация передается с запросом.

Вы можете написать такой драйвер фильтра самостоятельно (~ 6-9 человеко-месяцев работы, чтобы реализовать его правильно, а затем много времени для тестирования), или вы можете использовать наш продукт CallbackFilter и избегать разработки в режиме ядра. CallbackFilter предлагает встроенный драйвер и API для .NET, VCL и собственный C++.

+1

Благодарим за предложение Евгения, я действительно посмотрел на ваш CallbackFilter, прежде чем исследовать проект, который был отменен. Это хобби проект, поэтому мне нужно сохранить его просто на данный момент. Но вы будете иметь в виду;) –

+3

@Eugene: Этот ответ был помечен как спам несколькими пользователями. Я не уверен, что это так, потому что (несмотря на то, что я не являюсь экспертом в этой области), похоже, что ваш продукт на самом деле * обеспечивает * решение проблемы. Однако в будущем вы, возможно, захотите рассмотреть вопрос о том, чтобы сделать его более очевидным, что вы продвигаете свой собственный продукт. Возможно, отказ от дна или что-то еще. И +1 для борьбы с downvotes. –

+1

@ Коди Серый - фраза «наш ... продукт» вместе с именем пользователя говорит об этом довольно четко, как и для меня, и это было рассмотрено ранее (оба обсуждались на Meta и протестированы здесь) и приняты. –