从虚拟盒共享文件夹读取时,ReadFile winapi失败。 GetLastError抛出错误183

时间:2012-11-14 14:27:26

标签: c++ winapi readfile

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

我的代码示例

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

//out:
//err: 183

任何人都可以帮我解决奇怪的错误吗?

1 个答案:

答案 0 :(得分:-1)

首先,你的代码片段有点......不稳定。 ReadFile返回一个BOOL(一种Microsoft定义的类型,它存在于C之前的'bool'之前)。然后,您将其分配给C风格的bool,然后将该bool与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发布的代码与失败的代码不同。