3

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

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() 上下文中表示什么?

谁能帮我弄清楚为什么?

4

2 回答 2

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
}

您的代码正在返回与调用无关的早期失败的错误代码ReadFile

于 2012-02-03T13:06:06.490 回答
0

最后一个错误可能是由之前调用 CreateFile 引起的。如果您为dwCreationDisposition指定 CREATE_ALWAYS 或 CREATE_NEW,此函数会将最后一个错误值设置为 ERROR_ALREADY_EXISTS 。

重要的是要知道最后一个错误可以由任何函数设置。您应该始终检查指示函数是否失败的函数的返回值。

于 2012-02-03T12:38:47.043 回答