C ++ WinApi: ReadDirectoryChangesW () Empfangen doppelter Benachrichtigungen

Ich versuche zu verstehenReadDirectoryChangesW Funktion, damit ich effektiv über Änderungen des Inhalts in mehreren Verzeichnissen informiert werden kann (Dateien überschrieben, Dateien gelöscht, umbenannt usw.).

Eine meiner jüngsten Beobachtungen ist, dass für jede DateiSchreiboperationErhalte ich immerzwei Benachrichtigungen für eine einzelne Datei.

Ich habe das sehr sorgfältig nachverfolgt, und ich bin mir sicher, dass, wenn ich eine Datei überschreibe (z. B. eine TXT-Datei mit einem neuen Inhalt - im Grunde ein paar zusätzliche Buchstaben),ReadDirectoryChangesW() benachrichtigt mich zwei mal pro datei speichern.

Dies ist eine ernste Sache, da ich davon ausgehe, nur einmal pro Änderung benachrichtigt zu werden. Ich möchte nicht ungewollt Operationen wiederholen, die in meiner Anwendung nur einmal vorkommen sollten.

Ist dieses Verhalten bekannt? Gibt es eine Möglichkeit, nur zu empfangeneine Benachrichtigung pro Änderung, Bitte? Gibt es einen Weg zu effektivDoppelmeldungen vermeiden?

Ich benutze:

Nicht verwaltetes C ++Visual Studio 2012Windows 7 x64

Ich benutze ziemlich einfachen Code, um meine Tests durchzuführen, aber Sie werden es sehen wollen, also hier ist es:

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;
        }
    }

Antworten auf die Frage(2)

Ihre Antwort auf die Frage