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

时间:2012-02-03 12:29:01

标签: winapi visual-c++ file-read 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();
}

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

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

2 个答案:

答案 0 :(得分:8)

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

此处所涉及的API为ReadFiledocumentation说:

  

返回值

     

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

     

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

换句话说,只有在ReadFile返回FALSE时才能调用它。

您的代码应如下所示:

if (!ReadFile(fp,destCharArray,ByesToRead,NoOfBytesRead,NULL))
{
    DWORD err = GetLastError();
    // handle error probably by raising exception
}

您的代码返回的错误代码表示与ReadFile调用无关的早期失败。

答案 1 :(得分:0)

最后一个错误可能是因为先调用CreateFile。如果为 dwCreationDisposition 指定CREATE_ALWAYS或CREATE_NEW,则此函数将最后一个错误值设置为ERROR_ALREADY_EXISTS。

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