关于 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”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章