Вопросы изменения файлов в системах больших объемов
Обновлен: Ноябрь 2007
Компонент FileSystemWatcher может получать огромное количество событий, особенно если наблюдает за часто изменяемым каталогом. Это может привести к проблемам, так как компонент FileSystemWatcher предназначен для получения уведомлений о событиях, поступающих с определенной управляемой скоростью. Если скорость поступления событий превышает скорость их приема компонентом, избыточные события помещаются в буфер, откуда позже передаются в компонент. Компонент преобразует каждую запись в буфере в событие, которое будет вызвано в коде пользователя. Переполнение буфера может вызвать ряд проблем. Если изменений в каталоге так много, что они все не помещаются в буфере, операционная система выдает "пустое" уведомление, и компонент создает исключение.
Примечание о безопасности. |
---|
Если злонамеренная программа получает доступ к каталогу, за которым наблюдает компонент FileSystemWatcher, возможно возникновение атаки типа "отказ в обслуживании" (DoS), которая вызовет большое количество изменений, с которыми компонент не сможет справиться. Чтобы уменьшить риск атаки типа "отказ в обслуживании", следуйте рекомендациям в данном разделе справки и корректно используйте списки управления доступом. |
Чтобы избежать этой проблемы, необходимо выполнить следующие действия. Во-первых, установите оптимальный размер буфера, рассчитав среднее количество возможных событий. По умолчанию размер буфера установлен в 4 КБ. Буфер размером 4 КБ может отслеживать изменения в каталоге, содержащем примерно 80 файлов. Каждое событие занимает 16 байт в буфере плюс несколько байт для хранения имени файла в кодировке Юникода (2 байта на символ), в котором произошло изменение. Эти сведения можно использовать для оценки требуемого размера буфера.
Размер буфера устанавливается с помощью свойства InternalBufferSize в окне Свойства. В Microsoft Windows 2000 размер буфера следует увеличивать шагами по 4 КБ, что объясняется стандартным размером страницы памяти операционной системы. В любой другой операционной системе также следует увеличивать размер буфера шагами, равными стандартному размеру страницы памяти операционной системы.
Совет. |
---|
Если стандартный размер страницы памяти неизвестен, самый безопасный способ состоит в простом удвоении исходного размера буфера. Это сохранит интервал, необходимый для операционной системы. |
Кроме установки соответствующего размера буфера можно использовать еще три свойства для управления количеством сведений, помещаемых в буфер.
Используйте свойство NotifyFilter, чтобы определить, следит ли компонент FileSystemWatcher за всеми или только за заданными изменениями в наблюдаемом каталоге.
Используйте свойство IncludeSubdirectories, чтобы указать, следует ли включить вложенные папки в наблюдаемый каталог. Если это свойство выключить, количество получаемых событий заметно снизится.
Если компонент FileSystemWatcher наблюдает за событием Changed, с помощью свойства NotifyFilter можно задать получение только необходимых событий.
Примечание. Несмотря на то, что свойство Filter можно использовать для указания совокупности файлов и вложенных папок для наблюдения, оно применяется только после добавления изменений в буфер и поэтому размер буфера уменьшен не будет. Вместо этого для управления количеством сведений, записываемых в буфер, используется свойство NotifyFilter.
См. также
Задачи
Практическое руководство. Настройка экземпляров компонента FileSystemWatcher