Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

ReadDirectoryChangesW()

2 réponses
Avatar
Vincent
Bonjour,

J'ai un soucis concernant ReadDirectoryChangesW(). Il doit s'agir d'une
erreur bête de ma part car je ne vois pas grand chose sur le sujet lors
de mes recherches sur le net. Mon soucis est sur l'utilisation du champ
NextEntryOffset de la structure FILE_NOTIFY_INFORMATION.

Le cas que je teste est le renommage d'un fichier. Je fait mon appel
ReadDirectoryChangesW() qui remplis le buffer (alloué plus de 16K).

J'arrive à lire la première entrée (FILE_ACTION_RENAMED_OLD_NAME), mais
dès que j'essaie de pointer sur la seconde entrée, j'ai des valeurs
délirante de positionnées dans les champs de FILE_NOTIFY_INFORMATION.
J'ai un doute sur la ligne de la fonction suivante :
ChangeInfo += ChangeInfo->NextEntryOffset;

Merci de m'orienter sur mon erreur, car à force de boucler sur le pb, je
ne vois plus rien.

void DispatchChanges (LPVOID Buffer)
{
FILE_NOTIFY_INFORMATION *ChangeInfo = NULL;
char filename[MAX_PATH];

ChangeInfo = Buffer;
if (ChangeInfo == NULL)
return;

while (TRUE)
{
memset(filename, '\0', MAX_PATH);
memcpy(filename, ChangeInfo->FileName, ChangeInfo->FileNameLength);

switch (ChangeInfo->Action)
{
case FILE_ACTION_ADDED:
wprintf(L"File added : %s\n", filename);
break;
case FILE_ACTION_REMOVED:
wprintf(L"File removed : %s\n", filename);
break;
case FILE_ACTION_MODIFIED:
wprintf(L"File modified : %s\n", filename);
break;
case FILE_ACTION_RENAMED_OLD_NAME:
wprintf(L"File renamed (old name) : %s\n", filename);
break;
case FILE_ACTION_RENAMED_NEW_NAME:
wprintf(L"File renamed (new name): %s\n", filename);
break;
default:
wprintf(L"Default...%s\n", filename);
break;
}

/* Is there any further entry ? */
if (ChangeInfo->NextEntryOffset == 0)
break;
else
ChangeInfo += ChangeInfo->NextEntryOffset;
}
}

2 réponses

Avatar
robert
Vincent a écrit :

Bonjour,

J'ai un soucis concernant ReadDirectoryChangesW(). Il doit s'agir d'une
erreur bête de ma part car je ne vois pas grand chose sur le sujet lors
de mes recherches sur le net. Mon soucis est sur l'utilisation du champ
NextEntryOffset de la structure FILE_NOTIFY_INFORMATION.

Le cas que je teste est le renommage d'un fichier. Je fait mon appel
ReadDirectoryChangesW() qui remplis le buffer (alloué plus de 16K).

J'arrive à lire la première entrée (FILE_ACTION_RENAMED_OLD_NAME), mais
dès que j'essaie de pointer sur la seconde entrée, j'ai des valeurs
délirante de positionnées dans les champs de FILE_NOTIFY_INFORMATION.
J'ai un doute sur la ligne de la fonction suivante :
ChangeInfo += ChangeInfo->NextEntryOffset;

Merci de m'orienter sur mon erreur, car à force de boucler sur le pb, je
ne vois plus rien.

void DispatchChanges (LPVOID Buffer)
{
FILE_NOTIFY_INFORMATION *ChangeInfo = NULL;
char filename[MAX_PATH];

ChangeInfo = Buffer;
if (ChangeInfo == NULL)
return;

while (TRUE)
{
memset(filename, '', MAX_PATH);
memcpy(filename, ChangeInfo->FileName, ChangeInfo->FileNameLength);

switch (ChangeInfo->Action)
{
case FILE_ACTION_ADDED:
wprintf(L"File added : %sn", filename);
break;
case FILE_ACTION_REMOVED:
wprintf(L"File removed : %sn", filename);
break;
case FILE_ACTION_MODIFIED:
wprintf(L"File modified : %sn", filename);
break;
case FILE_ACTION_RENAMED_OLD_NAME:
wprintf(L"File renamed (old name) : %sn", filename);
break;
case FILE_ACTION_RENAMED_NEW_NAME:
wprintf(L"File renamed (new name): %sn", filename);
break;
default:
wprintf(L"Default...%sn", filename);
break;
}

/* Is there any further entry ? */
if (ChangeInfo->NextEntryOffset == 0)
break;
else
ChangeInfo += ChangeInfo->NextEntryOffset;
}
}


ChangeInfo += (FILE_NOTIFY_INFORMATION)((char*)ChangeInfo +
ChangeInfo->NextEntryOffset);

car l'ajout de pointeur multiplie automatiquement par
sizeof(FILE_NOTIFY_INFORMATION)
Avatar
Vincent
On 15/07/2009 08:21, robert wrote:

ChangeInfo += (FILE_NOTIFY_INFORMATION)((char*)ChangeInfo +
ChangeInfo->NextEntryOffset);

car l'ajout de pointeur multiplie automatiquement par
sizeof(FILE_NOTIFY_INFORMATION)



Mais c'est bien sûr, quelle truffe!!
D'ailleurs ça serait plutot :

ChangeInfo = (FILE_NOTIFY_INFORMATION*)((char*)ChangeInfo
+ChangeInfo->NextEntryOffset);

Merci de l'aide.

Vincent