2

私は本当に愚かなことをしていて、それを見ていないと確信していますが、次のコードが渡されたディレクトリの変更を取得しない理由を誰か教えてもらえますか?

このコードを呼び出すと、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 のものを間違って実装していると思いますか?

4

1 に答える 1

3

戻り値は確認しましたか?そして、これはネットワーク経由ですか?

編集:おそらく OVERLAPPED をゼロに初期化する必要があります。

于 2009-01-27T16:41:38.867 に答える