cerco di capire ReadDirectoryChangesW
funzione in modo da poter essere informato in modo efficace sul cambiamento di contenuti in diverse directory (file sovrascritti, file cancellati, rinominati, ecc ..).C++ Winapi: ReadDirectoryChangesW() Ricezione doppie Notifiche
Uno dei miei recenti osservazioni è che per ogni file operazione di scrittura, ricevo sempre due notifiche per singolo file.
Ho tracciato con molta attenzione, e sono sicuro, che se sovrascrivo un file (ad esempio un file .txt con un nuovo contenuto - fondamentalmente un paio di lettere extra all'interno), ReadDirectoryChangesW()
mi notifica due volte per quel file salvato.
Questa è una cosa seria, poiché mi aspetto di ricevere una notifica solo una volta per ogni modifica. Non desidero ripetere involontariamente operazioni che dovrebbero accadere solo una volta nella mia applicazione.
È noto questo comportamento? C'è un modo per ricevere solo una notifica per una modifica, per favore? C'è modo di efficacemente evitare doppie notifiche?
io uso:
- non gestito C++
- Visual Studio 2012
- Windows 7 x64
io uso il codice piuttosto semplice per fare le mie prove, ma si vuole vedere esso, quindi eccolo:
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;
}
}
Prima di pronunciare ogni operazione di scrittura, ma il tuo esempio è sovrascritto. Vorrei ipotizzare che la sovrascrittura potrebbe comportare più di una singola operazione dal punto di vista della directory (come eliminare quindi creare) anziché solo scrivere/accodare a un file esistente. Ma non ho alcun riferimento autorevole su questo ... – TheUndeadFish
possibile duplicato di [voci doppie di Filesystemwatcher] (http://stackoverflow.com/questions/9902758/filesystemwatcher-double-entries) –
@TheUndeadFish, ciao e grazie per la tua idea. È davvero molto intelligente. Ho provato i miei test con altre bandiere. Posso dire che, ad esempio, ** FILE_NOTIFY_CHANGE_ATTRIBUTES ** restituisce anche due notifiche. Questo può essere spiegato, che su sovrascrittura di file, più di un attributo è normalmente cambiato? –