C++ WinApi: ReadDirectoryChangesW() Ayant Reçu Le Double De Notifications

J'essaie de comprendre ReadDirectoryChangesW fonction, donc je peux être effectivement informés sur le changement du contenu dans plusieurs répertoires (fichiers écrasés, les fichiers supprimés, renommés, etc..).

Une de mes récentes observations est que pour chaque fichier opération d'écriture, je reçois toujours deux notifications pour seul fichier.

J'ai tracé que très attentivement, et je suis sûr que si je l'écrasement d'un fichier (disons un .fichier txt avec un nouveau contenu essentiellement de gagner quelques lettres de l'intérieur), ReadDirectoryChangesW() m'avise deux fois par que d'enregistrer le fichier.

C'est une chose sérieuse, comme je m'attends à être averti qu'une seule fois par le changement. Je ne souhaite pas involontairement répéter les opérations qui devrait se produire qu'une seule fois dans ma demande.

Est ce problème connu? Est-il un moyen pour ne recevoir que une notification par un changement, s'il vous plaît? Est-il moyen efficace pour d'éviter les doubles notifications?

J'utilise:

  • Le C++
  • Visual Studio 2012
  • Windows 7 x64

J'ai une utilisation assez basique code pour faire mes tests, mais vous voulez le voir, il est donc ici:

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;
        }
    }
Tout d'abord vous dire que chaque opération d'écriture, mais alors votre exemple est écraser. Je présume que l'écrasement peut impliquer plus d'une seule opération à partir de l'annuaire du point de vue (comme supprimer puis créer), contrairement à l'écriture/l'ajout à un fichier existant. Mais je n'ai pas de référence sur ce...
double possible de Filesystemwatcher entrées en double
bonjour et merci pour votre idée. Il est en effet très intelligent. J'ai essayé mes tests avec un autre drapeau. Je peux dire, que par exemple, FILE_NOTIFY_CHANGE_ATTRIBUTES renvoie deux notifications. Cela peut être expliqué, que sur l'écrasement des fichiers, plus d'un attribut est normalement changé?

OriginalL'auteur Bunkai.Satori | 2012-12-26