C ++ WinApi: ReadDirectoryChangesW () Odbieranie podwójnych powiadomień

próbuję zrozumiećReadDirectoryChangesW funkcja, dzięki czemu mogę być skutecznie informowany o zmianie treści w kilku katalogach (pliki nadpisane, pliki usunięte, przemianowane itp.).

Jedną z moich ostatnich obserwacji jest to, że dla każdego plikuoperacja zapisu, Zawsze otrzymujędwa powiadomienia dla pojedynczego pliku.

Wyśledziłem to bardzo dokładnie i jestem pewien, że jeśli nadpisam plik (powiedz plik .txt z nową zawartością - w zasadzie kilka dodatkowych liter w środku),ReadDirectoryChangesW() dwa razy powiadamia mnie o tym zapisie pliku.

To poważna sprawa, ponieważ oczekuję, że będę powiadamiany tylko raz na zmianę. Nie chcę nieumyślnie powtarzać operacji, które powinny mieć miejsce tylko raz w mojej aplikacji.

Czy to zachowanie jest znane? Czy istnieje sposób na otrzymanie tylkojedno powiadomienie na jedną zmianę, Proszę? Czy istnieje sposób na skuteczneunikać podwójnych powiadomień?

Używam:

Niezarządzany C ++Visual Studio 2012Windows 7 x64

Do przeprowadzania testów używam dość podstawowego kodu, ale będziesz chciał go zobaczyć, więc oto jest:

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