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,
¬ifyInfo,
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?
Vous souhaitez probablement initialiser OVERLAPPED à zéro. – MSN
* soupir *, oui, c'était le problème. Merci de votre aide. – mockobject