Почему мой ReadDirectoryChangesW не забирает измененные файлы?
Я уверен, что просто делаю что-то действительно глупое и не вижу этого, но может кто-нибудь сказать мне, почему следующий код не будет регистрировать изменения в переданном каталоге?
При вызове этого кода создание и изменение файлов или каталогов в переданном в m_directory игнорируется. Но если я позвоню
PostQueuedCompletionStatus( m_hCompletionPort, 0, 0, NULL );
тогда GetQueuedCompletionStatus корректно завершается. Кто-нибудь видит, что я делаю не так? Вот код:
// create handle to log dir
HANDLE logDirHandle = CreateFile(m_directory,
FILE_LIST_DIRECTORY,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS |
FILE_FLAG_OVERLAPPED,
NULL);
// create the completion port
m_hCompletionPort = CreateIoCompletionPort(logDirHandle, NULL, 0, 1);
// initial registration for changes
DWORD dwBufLength;
FILE_NOTIFY_INFORMATION notifyInfo;
OVERLAPPED overlapped;
ReadDirectoryChangesW(logDirHandle,
¬ifyInfo,
MAX_BUFFER,
TRUE,
FILE_NOTIFY_CHANGE_LAST_WRITE|FILE_NOTIFY_CHANGE_CREATION,
&dwBufLength,
&overlapped,
NULL);
// wait for a change
LPOVERLAPPED lpOverLapped;
ULONG key;
DWORD numBytes;
GetQueuedCompletionStatus(m_hCompletionPort, &numBytes, &key, &lpOverLapped, INFINITE))
РЕДАКТИРОВАТЬ:
Хорошо, я подумал наверняка, ReadDirectoryChangesW() возвращал TRUE, но это не так. GetLastError() сообщает мне, что ошибка ERROR_INVALID_HANDLE (6). Странно то, что logDirHandle представляется действительным, и при вызове CreateFile() не произошло никаких ошибок.
Также я немного изменил рефакторинг для вызова синхронного ReadDirectoryChangesW, сохраняя все то же самое, кроме потери OVERLAPPED, и все работало нормально. Таким образом, я предполагаю, что я неправильно реализую материал OVERLAPPED?
1 ответ
Вы проверяли возвращаемые значения? И это по сети?
Редактировать: Вы, вероятно, хотите инициализировать OVERLAPPED на ноль.