Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Win API


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / WinAPI

Выпуск № 335
от 05.11.2006, 15:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 383, Экспертов: 26
В номере:Вопросов: 1, Ответов: 1


Вопрос № 60782: Доброе время суток! Очень нужен пример функции ReadDirectoryChangesW в подробностях. Нужно на Русском. Спасибо огромное!...

Вопрос № 60.782
Доброе время суток!
Очень нужен пример функции ReadDirectoryChangesW в подробностях.
Нужно на Русском.
Спасибо огромное!
Отправлен: 31.10.2006, 15:30
Вопрос задал: Joy~ (статус: 6-ой класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Sergey A. Wedensky
Здравствуйте, Joy~!

В приложении пример функции потока, отслеживающего появление новых файлов в директории.

А вот дословный (практически :) перевод MSDN на тему ReadDirectoryChanges:

ReadDirectoryChangesW

ReadDirectoryChangesW получает информацию об изменениях в указанной директории.

BOOL ReadDirectoryChangesW(
HANDLE hDirectory,
LPVOID lpBuffer,
DWORD nBufferLength,
BOOL bWatchSubtree,
DWORD dwNotifyFilter,
LPDWORD lpBytesReturned,
LPOVERLAPPED lpOverlapped,
LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);

Параметры
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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.37 от 04.10.2006
Яндекс Rambler's Top100

В избранное