Почему мой 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,
    &notifyInfo,
    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 на ноль.

Другие вопросы по тегам