C ++ WinApi: ReadDirectoryChangesW () recibe notificaciones dobles

Intento entenderReadDirectoryChangesW función para que pueda informarme eficazmente sobre el cambio de contenido en varios directorios (archivos sobrescritos, archivos eliminados, renombrados, etc.).

Una de mis observaciones recientes es que para cada archivooperación de escritura, Recibo siempredos notificaciones para un solo archivo.

Lo rastreé con mucho cuidado, y estoy seguro, de que si sobrescribo un archivo (digamos un archivo .txt con un nuevo contenido, básicamente un par de letras adicionales en el interior),ReadDirectoryChangesW() me avisa dos veces por ese archivo guardar.

Esto es algo serio, ya que espero ser notificado solo una vez por cambio. No deseo repetir involuntariamente las operaciones que deberían ocurrir solo una vez en mi aplicación.

¿Se conoce este comportamiento? ¿Hay una manera de recibir solamenteuna notificación por un cambio, ¿Por favor? ¿Hay manera de efectivamenteevitar doble notificaciones?

Yo suelo:

C ++ no gestionadoVisual Studio 2012Windows 7 x64

Utilizo un código bastante básico para hacer mis pruebas, pero querrás verlo, así que aquí 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;
        }
    }

Respuestas a la pregunta(2)

Su respuesta a la pregunta