2009-01-27 9 views
2

Je suis sûr que je suis en train de faire quelque chose de vraiment stupide et de ne pas le voir, mais quelqu'un peut-il me dire pourquoi le code suivant ne serait pas ramasser les changements dans le répertoire transmis? Lors de l'appel de ce code, la création et la modification de fichiers ou de répertoires dans le m_directory transmis est ignorée. Mais si j'appellePourquoi mon ReadDirectoryChangesW ne récupère-t-il pas les fichiers modifiés?

PostQueuedCompletionStatus(m_hCompletionPort, 0, 0, NULL); 

alors GetQueuedCompletionStatus se ferme correctement. Est-ce que quelqu'un voit ce que je fais mal? Voici le code:

// create handle to log dir 
HANDLE logDirHandle = CreateFile(m_directory, 
    FILE_LIST_DIRECTORY, 
    FILE_SHARE_READ | FILE_SHARE_WRITE, 
    NULL, 
    OPEN_EXISTING, 
    FILE_FLAG_BACKUP_SEMANTICS | 
    FILE_FLAG_OVERLAPPED, 
    NULL); 

// create the completion port 
m_hCompletionPort = CreateIoCompletionPort(logDirHandle, NULL, 0, 1); 

// initial registration for changes 
DWORD     dwBufLength; 
FILE_NOTIFY_INFORMATION notifyInfo; 
OVERLAPPED    overlapped; 

ReadDirectoryChangesW(logDirHandle, 
    &notifyInfo, 
    MAX_BUFFER, 
    TRUE, 
    FILE_NOTIFY_CHANGE_LAST_WRITE|FILE_NOTIFY_CHANGE_CREATION,  
    &dwBufLength, 
    &overlapped, 
    NULL); 

// wait for a change 
LPOVERLAPPED lpOverLapped; 
ULONG   key; 
DWORD   numBytes; 

GetQueuedCompletionStatus(m_hCompletionPort, &numBytes, &key, &lpOverLapped, INFINITE)) 

EDIT:
Ok, je pensais à coup sûr ReadDirectoryChangesW() retournait vrai, mais ce n'est pas. GetLastError() me dit que l'erreur est ERROR_INVALID_HANDLE (6). La chose étrange est que logDirHandle semble être valide et aucune erreur ne s'est produite dans l'appel à CreateFile().

Aussi j'ai refactorisé légèrement pour appeler le ReadDirectoryChangesW synchrone en gardant tout le même, sauf perdre la substance OVERLAPPED et cela a bien fonctionné. Donc je devine que je suis en train d'implémenter les trucs CHEVAUCHEMENT incorrectement?

+1

Vous souhaitez probablement initialiser OVERLAPPED à zéro. – MSN

+0

* soupir *, oui, c'était le problème. Merci de votre aide. – mockobject

Répondre

3

Avez-vous vérifié les valeurs de retour? Et est-ce sur un réseau? Editer: Vous voulez probablement initialiser OVERLAPPED à zéro.

+0

Bien que je n'ai aucune validation dans le code que j'ai posté, j'ai validé que le handle de CreateFile() et de CreateIoCompletionPort() sont tous les deux valides et que ReadDirectoryChangesW() retourne TRUE. De plus, il s'agit d'un répertoire local mais il faudra travailler sur un partage à la fin. – mockobject

Questions connexes