对于 ReadFile() WinAPI,GetLastError 抛出错误 183。“ERROR_ALREADY_EXISTS”有何作用?在这种情况下意味着什么?

发布于 2025-01-02 08:43:27 字数 726 浏览 2 评论 0原文

我正在调用 ReadFile() WinAPI 将文件内容复制到 VC++ 代码中的字符数组。将 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() 上下文中意味着什么?

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

I am calling ReadFile() WinAPI to copy the file contents to a char array, inside my VC++ code. Have placed GetLastError() immediately after ReadFile().

for( read some n no: of files)
{
FileRead(fp,destCharArray,ByesToRead,NoOfBytesRead,NULL);
int ret = GetLastError();
}

GetLastError() is returning 183 only when 1st file is read. For all
other file reads its returning 183. But eventhough 183 is returned the
contents of file are copied to charArray. And the problem is that the
file read does not happen for some 28th file (here too return status
is 183). Irrespective of successful or unsuccessful file read, 183 is
returned!

According to http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx

error code 183 means "ERROR_ALREADY_EXISTS".

What does the above error status signify in ReadFile() context.?

Can anyone kindly help me in figuring out why?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

或十年 2025-01-09 08:43:27

您的代码错误地调用了 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 无关的早期故障的错误代码。

Your code is incorrectly calling GetLastError. You should only call GetLastError if the immediately prior Win32 API call failed, and that API returns status information through GetLastError.

Here the API in question is ReadFile. The documentation says:

Return value

If the function succeeds, the return value is nonzero (TRUE).

If the function fails, or is completing asynchronously, the return value is zero (FALSE). To get extended error information, call the GetLastError function.

In other words you must only call it if ReadFile returns FALSE.

Your code should look something like this:

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

Your code is returning the error code for an earlier failure that is unrelated to the call to ReadFile.

-残月青衣踏尘吟 2025-01-09 08:43:27

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

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

The last error might result from calling CreateFile prior. This function sets the last error value to ERROR_ALREADY_EXISTS if you specify CREATE_ALWAYS or CREATE_NEW for dwCreationDisposition.

It is important to know that the last error can be set by any function. You should always check the return value of the function which indicates if the function failed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文