Параметры
hDirectory
[->] Дескриптор директории для отслеживания изменений. Директория должна быть открыта с правом доступа FILE_LIST_DIRECTORY.
lpBuffer
[<->] Указатель на буфер, в который возвращаются данные. Формат буфера оперделяется структурой FILE_NOTIFY_INFORMATION. Буфер заполняется синфронно либо асинхронно, в зависимости от того, как открыт дескриптор директории и что указано в параметре lpOverlapped.
nBufferLength
[->] Размер буфера lpBuffer в байтах.
bWatchSubtree
[in] Если TRUE, функция отслеживает изменения в дереве директорий с корнем в указанной. Если FALSE, отслеживаются только изменения в диреткории, указанной в hDirectory.
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_LAST_ACCESS Изменилось время последнего доступа к какому-либо файлу.
FILE_NOTIFY_CHANGE_CREATION Изменилось время создания какого-либо файла.
FILE_NOTIFY_CHANGE_SECURITY Изменились атрибуты безопасности какого-либо файла.
lpBytesReturned
[<-] Для синхронного вызова, принимает количество байт, записанных в буфер. Для асинхронного вызова значение при возврате не опрпеделено. Для определения количества переданных данных используется механизм асинхронных оповещений.
lpOverlapped
[->] Указатель на структуру OVERLAPPED, используемую для асинхронного вызова. В случае синхронного вызова - NULL. Члены Offset и OffsetHigh структуры не используются.
lpCompletionRoutine
[->] Указатель на функцию, вызываемую по завершении и отмене операции. См. FileIOCompletionRoutine.
Возвращаемые значения
Не 0 при успешном завершении. Для синхронного вызова это означает, что операция успешно завершена. Для асинхронного вызова - успешно поставлена в очередь.
0 в случае ошибка. Используйте GetLastError.
Замечания
Для получения дескриптора директории используйте CreateFile с флагом FILE_FLAG_BACKUP_SEMANTICS.
Вызов ReadDirectoryChangesW может быть завершен синхронно или асинхронно. Для асинхронного вызова, открывайте директорию с помощью CreateFile, вдобавок указывая флаг FILE_FLAG_OVERLAPPED в параметре dwFlagsAndAttributes. Затем передавайте указатель на структуру OVERLAPPED в ReadDirectoryChangesW.
При первом вызове ReadDirectoryChangesW ОС выделяет буфер для накопления информации об изменениях. Этот буфер остается связанным с дескриптором директории до его закрытия и его размер остается неизменен. Изменения, происходящие между вызовами ReadDirectoryChangesW д
При асинхронном вызове можно получить оповещения одним из 3 способов:
Используя функцию GetOverlappedResult. Для этого не указывайте lpCompletionRoutine. Установите член hEvent структуры OVERLAPPED в уникальный дескриптор события.
Используя функцию GetQueuedCompletionStatus. Для этого не указывайте lpCompletionRoutine. Ассоциируйте дескриптор директории с портом завершения с помощью функции CreateIoCompletionPort.
Используя функцию завершения. Для этого укажите адрес функции завершения в lpCompletionRoutine. Эта функция вызывается при окончании или отмене операции когда поток находится в состоянии ожидания. Член hEvent структуры OVERLAPPED не используется.
ReadDirectoryChangesW завершается с ошибкой ERROR_INVALID_PARAMETER если размер буфера > 64 KB и приложение пытается следить за сетевым путем. Это следствие ограничений на размер пакета протоколов совместного использования.
Windows NT 4.0: ограничение составляет 4 KB.
Windows 2000: Клиенты, одновременно использующие несколько долговременных запросов должны иметь Service Pack 2 или выше. См. Knowledge Base Q271148.
Windows Me: Та же функциональность доступна посредством функции FindFirstChangeNotification.
Приложение:
Ответ отправил: Sergey A. Wedensky (статус: 6-ой класс)
Ответ отправлен: 31.10.2006, 16:43