关于 ReadFile() WinAPI,GetLastError 抛出错误 183。在这种情况下,“ERROR_ALREADY_EXISTS”是啥意思?

Posted

技术标签:

【中文标题】关于 ReadFile() WinAPI,GetLastError 抛出错误 183。在这种情况下,“ERROR_ALREADY_EXISTS”是啥意思?【英文标题】:With respect to ReadFile() WinAPI, GetLastError is throwing the error 183. What Does "ERROR_ALREADY_EXISTS" mean in this context?关于 ReadFile() WinAPI,GetLastError 抛出错误 183。在这种情况下,“ERROR_ALREADY_EXISTS”是什么意思? 【发布时间】:2012-02-26 01:45:42 【问题描述】:

我正在调用 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() 上下文中意味着什么?

谁能帮我找出原因?

【问题讨论】:

在此之前你是否在线程中做任何事情——例如createfile——这可能会导致错误? getlasterror 的返回只有在 readfile 返回 0 时才在此上下文中有效,而您没有检查它 【参考方案1】:

您的代码错误地调用了GetLastError。如果之前的 Win32 API 调用失败,并且该 API 通过 GetLastError 返回状态信息,您应该只调用 GetLastError

这里有问题的 API 是ReadFile。 documentation 说:

返回值

如果函数成功,则返回值非零(TRUE)。

如果函数失败或异步完成,则返回值为零 (FALSE)。要获取扩展错误信息,请调用 GetLastError 函数。

换句话说,您必须仅在ReadFile 返回FALSE 时调用它。

您的代码应如下所示:

if (!ReadFile(fp,destCharArray,ByesToRead,NoOfBytesRead,NULL))

    DWORD err = GetLastError();
    // handle error probably by raising exception

您的代码正在返回与调用 ReadFile 无关的早期故障的错误代码。

【讨论】:

谢谢大卫。但是我观察到即使没有字节被读入 destCharArray,ReadFile 的返回值也是 1!即 NoOfBytesRead == 0 并且 ReadFile 仍然返回 1。不明白为什么会这样?? 我不能说没有看到你的真实代码。问题中的代码不是真正的代码。该 API 称为 ReadFile 而不是 FileRead。第四个参数是一个指针。你似乎在传递价值。在看到实际代码之前,我无法评论具体细节。 当您到达文件末尾时,ReadFile() 成功并将读取的字节数设置为 0。【参考方案2】:

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

重要的是要知道最后一个错误可以由任何函数设置。你应该经常检查函数的返回值,它表明函数是否失败。

【讨论】:

正确的做法是检查函数的返回值,如果函数失败,只调用GetLastError。究竟是什么表明失败确实因呼叫而异,因此您总是与 MSDN 文档斗争。

以上是关于关于 ReadFile() WinAPI,GetLastError 抛出错误 183。在这种情况下,“ERROR_ALREADY_EXISTS”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改通过 ReadFile 函数读取的文本

WinApi FindFirstFile 和文件句柄

关于VC++的Winmain函数(WINAPI是啥?)

Qt 中的 Win32 API

关于VC++的Winmain函数(WINAPI是啥?)

匿名管道的 ReadFile 函数