关于ReadFile()WinAPI,GetLastError抛出错误183."ERROR_ALREADY_EXISTS"在这种情况下是什么意思?

cod*_*ver 3 winapi file-read visual-c++ windows-error-reporting

我调用ReadFile()WinAPI将文件内容复制到我的VC++代码中的char数组.在ReadFile()之后立即放置了GetLastError().

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

GetLastError()仅在读取第一个文件时返回183.对于所有其他文件读取它返回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()上下文中表示什么?

任何人都可以帮助我找出原因吗?

Dav*_*nan 8

您的代码调用错误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
}
Run Code Online (Sandbox Code Playgroud)

您的代码将返回与调用无关的早期故障的错误代码ReadFile.

  • 当您到达文件末尾时,ReadFile()成功并将读取的字节数设置为0. (2认同)