我正在调用ReadFile()WinAPI,将文件内容复制到我的VC++代码中的一个char数组中。已将GetLastError()放在ReadFile()之后。
for( read some n no: of files)
{
FileRead(fp,destCharArray,ByesToRead,NoOfBytesRead,NULL);
int ret = GetLastError();
}
只有在读取第一个文件时,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()上下文中,上面的错误状态表示什么。?
有人能帮我弄清楚为什么吗?
您的代码错误地调用了GetLastError
。如果上一个Win32 API调用失败,并且API通过GetLastError
返回状态信息,则只应调用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
无关的早期故障的错误代码。
最后一个错误可能是由于先前调用CreateFile而导致的。如果为dwCreationDisposition指定CREATE_ALLWAYS或CREATE_NEW,此函数会将最后一个错误值设置为error_ALREADY_EXISTS。
重要的是要知道最后一个错误可以由任何函数设置。您应该始终检查函数的返回值,该值指示函数是否失败。