Exactement comme il semble, je tente asynchrone ReadDirectoryChangesW
avec IO Achèvement et il ne fonctionne pas, en particulier, GetLastError
renvoie à plusieurs reprises 258 (GetQueuedCompletionStatus
timeout).ReadDirectoryChangesW asynchrone - GetQueuedCompletionStatus expire toujours
J'ai struct:
typedef struct dirinfo_struct
{
HANDLE hDirFH; // directory handle
OVERLAPPED Overlapped; // overlapped storage
int len_buffer; // buffer length
wchar_t* buffer; // buffer itself
wchar_t* directory_name; // target name
} dirinfo_t;
typedef struct dirmon_struct
{
HANDLE hDirOPPort; // handle to the IO port.
dirinfo_t* dirinfo; // pointer to the struct above.
} dirmon_t;
pour stocker les informations pertinentes. Ceci est initialisés:
dirinfo_t* t = malloc(1*sizeof(dirinfo_t));
dirmon_t* d = malloc(1*sizeof(dirmon_t));
dirinfo_init(t); // does t->buffer = malloc(8192*sizeof(wchar_t));
Puis-je créer ma poignée Directory et port com:
t->hDirFH = CreateFile(L"C:\\test",
FILE_LIST_DIRECTORY,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
NULL);
d->dirinfo = t;
d->hDirOPPort = CreateIoCompletionPort(d->dirinfo->hDirFH,
NULL,
(ULONG_PTR)(d->dirinfo),
1);
Ensuite, je passe ces informations par d à un nouveau thread. Maintenant, sur ledit nouveau thread j'ai:
bResultQ = GetQueuedCompletionStatus(d->hDirOPPort, lpBytes,
(ULONG_PTR*)d->dirinfo,
lpOverlapped, 1000);
if (bResultQ)
{
bResultR = ReadDirectoryChangesW(d->dirinfo->hDirFH,
(void*)d->dirinfo->buffer,
8192, TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME |
FILE_NOTIFY_CHANGE_DIR_NAME |
FILE_NOTIFY_CHANGE_ATTRIBUTES |
FILE_NOTIFY_CHANGE_SIZE |
FILE_NOTIFY_CHANGE_LAST_WRITE |
FILE_NOTIFY_CHANGE_LAST_ACCESS |
FILE_NOTIFY_CHANGE_CREATION |
FILE_NOTIFY_CHANGE_SECURITY,
lpReadDirBytes,
&d->dirinfo->Overlapped,
NULL);
}
else
{
printf("GetQueuedCompletionStatus(): Failed, ");
errorcode = GetLastError();
printf("Error Code %d\n", errorcode);
Sleep(500);
}
Je mis cette course et je off obtenir allègrement les délais d'attente (258 erreurs) que je devrais depuis le répertoire n'a pas changé. Cependant, même si je modifie le répertoire, je reçois toujours des messages d'erreur; en d'autres termes, ces modifications ne sont pas prises en compte. Ce qui m'amène à croire que j'ai mal configuré cette configuration.
Des idées?
Avertissements:
- Ironie du sort, ce qui finira par être converti en Python via pywin32. Cependant, jusqu'à ce que je comprenne comment cela est censé fonctionner en C, je n'y vais pas.
- Synchrone
ReadDirectoryChangesW
n'est pas une option. Si aucun événement n'est déclenché, j'ai besoin que le thread sur lequel il est en attente expire afin qu'il puisse vérifier s'il devrait encore être en cours d'exécution. J'écris dans C spécifiquement, pas C++. Etc non une option non plus - Je ne veux pas continuellement comparer les listes de répertoires pour déterminer ce qui a changé.
Autres notes:
- Le répertoire existe, cette poignée est NULL. De même pour le handle de comportement.
- Tout est d'être passé au fil
J'ai examiné à CDirectoryChangeWatcher du projet de code, mais l'utilisation de C++ et bien d'autres sujets à part, je ne vois pas ce que je fais différemment. N'hésitez pas à le signaler si quelque chose me manque!
La sortie, si elle aide, est fondamentalement répétée, peu importe combien je modifie le répertoire en question.
GetQueuedCompletionStatus(): Failed, Error Code 258
Pour que cela fonctionne bien n'est pas trivial (pour le moins). Si vous ne l'avez pas encore fait, je vous conseille de lire le blog de Jim Beveridge: http://qualapps.blogspot.com/2010/05/understanding-readdirectorychangesw.html. Attention: son exemple de code est en C++, mais au moins c'est mieux que la plupart. Attention2: Je suis raisonnablement certain que, quoi que vous fassiez, ReadDirectoryChangesW ne fonctionnera jamais entièrement correctement. Je conseille généralement d'utiliser des journaux de changement à la place. http://msdn.microsoft.com/en-us/library/aa363798.aspx. Ils ne sont pas triviaux non plus, mais au moins ils fonctionnent. –
@Jeffy merci, j'ai jeté un oeil à sa source, mais il n'a pas (pour autant que je peux voir) utiliser GetQueue ... ou CreateIo ... Son readme implique plus de fichiers que sont réellement là donc je pense il les a enlevés. Je commence lentement à venir à cette réalisation ... malheureusement, les revues à changement requièrent des privilèges d'administrateur que nous n'avons peut-être pas. Je pourrais toujours déclencher un service Windows pour gérer cela, je suppose. –