Вопросы изменения файлов в системах больших объемов

Обновлен: Ноябрь 2007

Компонент FileSystemWatcher может получать огромное количество событий, особенно если наблюдает за часто изменяемым каталогом. Это может привести к проблемам, так как компонент FileSystemWatcher предназначен для получения уведомлений о событиях, поступающих с определенной управляемой скоростью. Если скорость поступления событий превышает скорость их приема компонентом, избыточные события помещаются в буфер, откуда позже передаются в компонент. Компонент преобразует каждую запись в буфере в событие, которое будет вызвано в коде пользователя. Переполнение буфера может вызвать ряд проблем. Если изменений в каталоге так много, что они все не помещаются в буфере, операционная система выдает "пустое" уведомление, и компонент создает исключение.

ded0dc5s.alert_security(ru-ru,VS.90).gifПримечание о безопасности.

Если злонамеренная программа получает доступ к каталогу, за которым наблюдает компонент FileSystemWatcher, возможно возникновение атаки типа "отказ в обслуживании" (DoS), которая вызовет большое количество изменений, с которыми компонент не сможет справиться. Чтобы уменьшить риск атаки типа "отказ в обслуживании", следуйте рекомендациям в данном разделе справки и корректно используйте списки управления доступом.

Чтобы избежать этой проблемы, необходимо выполнить следующие действия. Во-первых, установите оптимальный размер буфера, рассчитав среднее количество возможных событий. По умолчанию размер буфера установлен в 4 КБ. Буфер размером 4 КБ может отслеживать изменения в каталоге, содержащем примерно 80 файлов. Каждое событие занимает 16 байт в буфере плюс несколько байт для хранения имени файла в кодировке Юникода (2 байта на символ), в котором произошло изменение. Эти сведения можно использовать для оценки требуемого размера буфера.

Размер буфера устанавливается с помощью свойства InternalBufferSize в окне Свойства. В Microsoft Windows 2000 размер буфера следует увеличивать шагами по 4 КБ, что объясняется стандартным размером страницы памяти операционной системы. В любой другой операционной системе также следует увеличивать размер буфера шагами, равными стандартному размеру страницы памяти операционной системы.

ded0dc5s.alert_note(ru-ru,VS.90).gifСовет.

Если стандартный размер страницы памяти неизвестен, самый безопасный способ состоит в простом удвоении исходного размера буфера. Это сохранит интервал, необходимый для операционной системы.

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

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

  • Используйте свойство IncludeSubdirectories, чтобы указать, следует ли включить вложенные папки в наблюдаемый каталог. Если это свойство выключить, количество получаемых событий заметно снизится.

  • Если компонент FileSystemWatcher наблюдает за событием Changed, с помощью свойства NotifyFilter можно задать получение только необходимых событий.

    ded0dc5s.alert_note(ru-ru,VS.90).gifПримечание.

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

См. также

Задачи

Практическое руководство. Настройка экземпляров компонента FileSystemWatcher

Основные понятия

Знакомство с наблюдением за событиями файловой системы