2

我正在调用 ReadFile winapi 函数从 virtualbox shated 文件夹中读取一些数据。读取文件失败。GetLastError 抛出 183 错误代码“当该文件已存在时无法创建文件”。有时它发生在 vmware 共享文件夹上。

我的代码示例

bool ret = ReadFile(hFile, buf, size, &bytesRead, nullptr);
if (ret == FALSE)
{
    logger << L"err: " + ToString(GetLastError());
}

//out:
//err: 183

谁能帮我解决奇怪的错误?

4

1 回答 1

-1

首先,您的代码片段有点……不可靠。ReadFile 返回一个 BOOL(一种 Microsoft 定义的类型,存在于 C 有“bool”之前的日子)。然后将其分配给 C 风格的布尔值,然后将该布尔值与 MS 常量“FALSE”进行比较。正如所写的那样,它并没有错,但是不必要地在各种形式的布尔值之间切换是一个坏主意,因为它往往会使更难看到测试的实际意义。

其次,我怀疑这段代码并不完全是失败的代码!

我这样说是因为我可以通过简单地反转 ReadFile 上的测试意义来产生所描述的行为。也就是说,如果您在 ReadFile 返回 true 时检查 GetLastError,它将(在我的机器上,今天,在读取串行端口时)给出错误 183!因此,我怀疑在实际代码中,OP 实际上以某种方式掩盖了布尔测试(就像我在当天早些时候所做的那样),从而导致了明显的虚假 ReadFile 错误。

我对此的解决方案是尽可能简单地重写测试,使用尽可能少的布尔值形式,以便最大程度地避免测试失败。

如果您将代码更改为此(假设您实际上不需要其他地方的 ReadFile 返回值):

if (!ReadFile(hFile, buf, size, &bytesRead, nullptr))
{
    DWORD err = GetLastError();
    logger << L"err: " + ToString(err);
}

该代码可以很容易地看出所讨论的测试的意义,并减少了编写错误测试的可能性。

如果您确实需要保留“ret”,请执行以下操作:

BOOL ret = ReadFile(hFile, buf, size, &bytesRead, nullptr);
if (!ret)
{
    DWORD err = GetLastError();
    logger << L"err: " + ToString(err);
}

在这两种情况下,您都会注意到我从日志行中提取了 GetLastError 调用。这是为了确保在调用 ReadFile 和调用 GetLastError 之间不会发生任何事情。

编辑:修改以澄清我的意见。原始版本没有说明我认为 OP 发布的代码与失败的代码不同。

于 2013-01-09T20:59:26.463 回答