Почему мой ReadDirectoryChangesW не забирает измененные файлы? - PullRequest
2 голосов
/ 27 января 2009

Я уверен, что просто делаю что-то действительно глупое и не вижу этого, но кто-нибудь может сказать мне, почему следующий код не будет регистрировать изменения в переданном каталоге?

При вызове этого кода создание и изменение файлов или каталогов в переданном в 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))

EDIT:
Хорошо, я подумал наверняка, ReadDirectoryChangesW () возвращал TRUE, но это не так. GetLastError () сообщает мне, что ошибка ERROR_INVALID_HANDLE (6). Странно то, что logDirHandle представляется действительным, и при вызове CreateFile () не произошло ошибок.

Также я немного изменил рефакторинг для вызова синхронного ReadDirectoryChangesW, сохранив все то же самое, кроме потери OVERLAPPED, и все работало нормально. Итак, я предполагаю, что неправильно внедряю OVERLAPPED?

1 Ответ

3 голосов
/ 27 января 2009

Вы проверяли возвращаемые значения? И это по сети?

Редактировать: Вы, вероятно, хотите инициализировать OVERLAPPED на ноль.

...