Я уверен, что просто делаю что-то действительно глупое и не вижу этого, но кто-нибудь может сказать мне, почему следующий код не будет регистрировать изменения в переданном каталоге?
При вызове этого кода создание и изменение файлов или каталогов в переданном в 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))
EDIT:
Хорошо, я подумал наверняка, ReadDirectoryChangesW () возвращал TRUE, но это не так. GetLastError () сообщает мне, что ошибка ERROR_INVALID_HANDLE (6). Странно то, что logDirHandle представляется действительным, и при вызове CreateFile () не произошло ошибок.
Также я немного изменил рефакторинг для вызова синхронного ReadDirectoryChangesW, сохранив все то же самое, кроме потери OVERLAPPED, и все работало нормально. Итак, я предполагаю, что неправильно внедряю OVERLAPPED?