C ++ WinApi: ReadDirectoryChangesW () recebendo notificações duplas

Eu tento entenderReadDirectoryChangesW função para que eu possa ser efetivamente informado sobre a mudança de conteúdo em vários diretórios (arquivos sobrescritos, arquivos excluídos, renomeados, etc.).

Uma das minhas observações recentes é que, para cada arquivooperação de gravaçãoRecebo sempreduas notificações para arquivo único.

Eu rastreei isso com muito cuidado, e tenho certeza, que se eu sobrescrever um arquivo (digamos um arquivo .txt com um novo conteúdo - basicamente um par de letras extras dentro),ReadDirectoryChangesW() me notifica duas vezes por esse arquivo salvar.

Isso é coisa séria, já que espero ser notificado apenas uma vez por alteração. Não desejo repetir operações que, por acaso, devem acontecer apenas uma vez na minha inscrição.

Esse comportamento é conhecido? Existe uma maneira de receber apenasuma notificação por uma alteração, por favor? Existe maneira de efetivamenteevitar notificações duplas?

Eu uso:

C ++ não gerenciadoVisual Studio 2012Windows 7 x64

Eu uso código bastante básico para fazer meus testes, mas você vai querer vê-lo, então aqui está:

HANDLE hDir = CreateFile(
    lpDir,
    FILE_LIST_DIRECTORY,
    FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
    NULL, 
    OPEN_EXISTING, 
    FILE_FLAG_BACKUP_SEMANTICS, 
    NULL);

    int nCounter = 0;
    FILE_NOTIFY_INFORMATION strFileNotifyInfo[1024];
    DWORD dwBytesReturned = 0;   

    while(TRUE)
    {
        if( ReadDirectoryChangesW ( hDir, (LPVOID)&strFileNotifyInfo, sizeof(strFileNotifyInfo), FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE, &dwBytesReturned, NULL, NULL) == 0)
        {
            ErrorCheck(_T("Reading Directory Change"));
        }
        else
        {
            _tcout << _T("File Modified: ") << strFileNotifyInfo[0].FileName << endl;
            _tcout << _T("Loop: ") << nCounter++ << endl;
        }
    }

questionAnswers(2)

yourAnswerToTheQuestion