Программирование для Windows NT

       

Извещения от файловой системы


Приложение Microsoft Windows NT может динамически следить за содержимым выбранного каталога или даже дерева каталогов, получая от файловой системы извещения при изменении содержимого каталога. Механизм таких извещений основан на использования объектов-событий и функций FindFirstChangeNotification, FindNextChangeNotification, FindCloseChangeNotification.

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

HANDLE FindFirstChangeNotification(

  LPCTSTR lpPathName, // адрес пути к каталогу

  BOOL bWatchSubtree, // флаг управления каталогом или деревом

  DWORD dwNotifyFilter); // флаги событий

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

Если при вызове функции флаг bWatchSubtree будет равен TRUE, будут отслеживаться изменения не только в каталоге, указанном в параметре lpPathName, но и во всех его подкаталогах. Если же значение этого флага будет равно FALSE, при изменении содержимого подкаталогов ваше приложение не получит извещение.

При помощи параметра dwNotifyFilter вы можете указать события, при возникновении которых в указанном каталоге или дереве каталогов ваше приложение получит извещение. Здесь вы можете указать комбинацию следующих констант:

Константа



Описание изменений

FILE_NOTIFY_CHANGE_FILE_NAME

Изменение имен файлов, расположенных в указанном каталоге и его подкаталогах, создание и удаление файлов

FILE_NOTIFY_CHANGE_DIR_NAME

Изменение имен каталогов, создание и удаление каталогов

FILE_NOTIFY_CHANGE_ATTRIBUTES

Изменение атрибутов

FILE_NOTIFY_CHANGE_SIZE

Изменение размеров файлов (после записи содержимого внутренних буферов на диск)

FILE_NOTIFY_CHANGE_LAST_WRITE

Изменение времени записи для файлов (после записи содержимого внутренних буферов на диск)

FILE_NOTIFY_CHANGE_SECURITY

Изменение дескриптора защиты

<
Функция FindFirstChangeNotification создает объект-событие и возвращает его идентификатор. При ошибке возвращается значение INVALID_HANDLE_VALUE.

Полученный идентификатор может быть использован в операциях ожидания, выполняемых при помощи функций WaitForSingleObject и WaitForMultipleObjects. Когда произойдет одно из событий, указанных функции FindFirstChangeNotification в параметре dwNotifyFilter, этот объект-событие перейдет в отмеченное значение.

Таким образом, приложение может создать задачу, которая вызывает функцию FindFirstChangeNotification и затем выполняет ожидание для созданного ей объекта синхронизации. При возникновении события эта задача перейдет в активное состояние. При этом она, например, может выполнить сканирование каталога, указанного в параметре lpPathName, для обнаружения возникших изменений.

Заметим, что несмотря на свое название, функция FindFirstChangeNotification не обнаруживает изменения. Она только создает объект синхронизации, который переходит в отмеченное состояние при возникновении таких изменений.

После того как ваше приложение выполнило обнаружение и обработку изменений, оно должно вызвать функцию FindNextChangeNotification:

BOOL FindNextChangeNotification(HANDLE hChangeHandle);

В качестве параметра этой функции передается идентификатор объекта синхронизации, созданного функцией FindFirstChangeNotification. Функция FindNextChangeNotification переводит объект синхронизации в неотмеченное состояние таким образом, что его можно использовать повторно для обнаружения последующих изменений.

 Если ваше приложение больше не собирается получать извещения от файловой системы, оно должно закрыть идентификатор соответствующего объекта синхронизации. Для этого следует вызвать функцию FindCloseChangeNotification, передав ей через единственный параметр идентфикатор, полученный от функции FindFirstChangeNotification:

BOOL FindCloseChangeNotification(HANDLE hChangeHandle);


Содержание раздела