3 votes

En ce qui concerne l'interface WinAPI ReadFile(), GetLastError génère l'erreur 183. Que signifie "ERROR_ALREADY_EXISTS" dans ce contexte ?

J'appelle l'interface WinAPI ReadFile() pour copier le contenu du fichier dans un tableau de caractères, dans mon code VC++. J'ai placé GetLastError() immédiatement après ReadFile().

for( read some n no: of files)
{
FileRead(fp,destCharArray,ByesToRead,NoOfBytesRead,NULL);
int ret = GetLastError();
}

GetLastError() renvoie 183 uniquement lorsque le 1er fichier est lu. Pour toutes les autres fichiers lus, elle renvoie 183. Mais même si 183 est renvoyé, le contenu du le contenu du fichier est copié dans charArray. Et le problème est que la lecture du fichier fichier n'a pas lieu pour un 28ème fichier (ici aussi, le statut de retour est est 183). Indépendamment de la réussite ou de l'échec de la lecture du fichier, 183 est retourné ! retourné !

Según http://msdn.microsoft.com/en-us/library/Windows/desktop/ms681382(v=vs.85).aspx

Le code d'erreur 183 signifie " ERREUR_DÉJÀ_EXISTANTE ".

Que signifie l'état d'erreur ci-dessus dans le contexte de ReadFile() ?

Quelqu'un peut-il m'aider à comprendre pourquoi ?

8voto

David Heffernan Points 292687

Votre code n'appelle pas correctement GetLastError . Vous ne devez appeler GetLastError si l'appel à l'API Win32 immédiatement antérieur a échoué, et que l'API renvoie des informations d'état par l'intermédiaire de GetLastError .

Ici, l'API en question est ReadFile . Le site documentation dit :

Valeur de retour

Si la fonction réussit, la valeur de retour est non nulle ( VRAI ).

Si la fonction échoue, ou si elle se termine de manière asynchrone, la valeur de retour est zéro ( FAUX ). Pour obtenir des informations d'erreur étendues, appelez la fonction GetLastError fonction.

En d'autres termes, vous ne devez l'appeler que si ReadFile renvoie à FALSE .

Votre code devrait ressembler à quelque chose comme ceci :

if (!ReadFile(fp,destCharArray,ByesToRead,NoOfBytesRead,NULL))
{
    DWORD err = GetLastError();
    // handle error probably by raising exception
}

Votre code renvoie le code d'erreur d'un échec antérieur qui n'est pas lié à l'appel à la fonction ReadFile .

0voto

Norbert Willhelm Points 1449

La dernière erreur peut résulter d'un appel préalable à CreateFile. Cette fonction attribue à la dernière erreur la valeur ERROR_ALREADY_EXISTS si vous spécifiez CREATE_ALWAYS ou CREATE_NEW pour le fichier CreateFile. dwCreationDisposition .

Il est important de savoir que la dernière erreur peut être définie par n'importe quelle fonction. Vous devez toujours vérifier la valeur de retour de la fonction qui indique si la fonction a échoué.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X