Что касается WinAPI ReadFile (), GetLastError выдает ошибку 183. Что означает в этом контексте «ERROR_ALREADY_EXISTS»? - PullRequest
3 голосов
/ 03 февраля 2012

Я вызываю ReadFile () WinAPI, чтобы скопировать содержимое файла в массив char внутри моего кода VC ++. Поместили GetLastError () сразу после ReadFile ().

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

GetLastError () возвращает 183 только при чтении 1-го файла. Для всех другой файл читает его возвращение 183. Но даже если 183 возвращается содержимое файла копируется в charArray. И проблема в том, что чтение файла не происходит для какого-то 28-го файла (здесь тоже возвращается статус 183). Независимо от успешного или неудачного чтения файла, 183 вернулся!

Согласно http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx

код ошибки 183 означает « ERROR_ALREADY_EXISTS ».

Что означает вышеуказанное состояние ошибки в контексте ReadFile ().?

Может ли кто-нибудь помочь мне выяснить, почему?

Ответы [ 2 ]

8 голосов
/ 03 февраля 2012

Ваш код неправильно звонит GetLastError.Вы должны вызывать GetLastError только в том случае, если непосредственно предшествующий вызов Win32 API не удался, и этот API возвращает информацию о состоянии через GetLastError.

Здесь речь идет об API ReadFile.Документация гласит:

Возвращаемое значение

Если функция завершается успешно, возвращаемое значение отлично от нуля ( TRUE ).

Если функция завершается ошибкой или завершается асинхронно, возвращаемое значение равно нулю ( FALSE ).Чтобы получить расширенную информацию об ошибке, вызовите функцию GetLastError .

Другими словами, вы должны вызывать ее, только если ReadFile возвращает FALSE.

Ваш код должен выглядеть примерно так:

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

Ваш код возвращает код ошибки для более ранней ошибки, не связанной с вызовом ReadFile.

0 голосов
/ 03 февраля 2012

Последняя ошибка может возникнуть в результате вызова CreateFile ранее.Эта функция устанавливает значение последней ошибки ERROR_ALREADY_EXISTS, если вы задаете CREATE_ALWAYS или CREATE_NEW для dwCreationDisposition .

Важно знать, что последняя ошибка может быть установлена ​​любой функцией.Вы всегда должны проверять возвращаемое значение функции, которое указывает, не сработала ли функция.

...