C ++ WinApi: ReadDirectoryChangesW () Получение двойных уведомлений

я пытаюсь понятьReadDirectoryChangesW функция, чтобы я мог быть эффективно информирован об изменении содержимого в нескольких каталогах (файлы перезаписаны, файлы удалены, переименованы и т. д.).

Одно из моих недавних наблюдений состоит в том, что для каждого файлаоперация записиПолучаю всегдадва уведомления для одного файла.

Я проследил это очень тщательно, и я уверен, что если я перезаписываю файл (скажем, файл .txt с новым содержимым - в основном пару лишних букв внутри),ReadDirectoryChangesW() уведомляет меня два раза за сохранение этого файла.

Это серьезная вещь, так как я ожидаю, что получит уведомление только один раз за изменение. Я не хочу непреднамеренно повторять операции, которые должны произойти только один раз в моем приложении.

Известно ли это поведение? Есть ли способ получить толькоодно уведомление за одно изменение, пожалуйста? Есть ли способ эффективноизбегать двойных уведомлений?

Я использую:

Неуправляемый C ++Visual Studio 2012Windows 7 x64

Я использую довольно простой код для своих тестов, но вы захотите его увидеть, так что вот оно:

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

Ответы на вопрос(2)

Ваш ответ на вопрос