CreateFileA会间歇性地返回错误20,“系统无法找到指定的设备”

时间:2015-03-05 21:30:23

标签: c++ winapi msbuild createfile

我正在使用msbuild exec任务编译代码时调试自定义exe。

它运行以下代码:

HANDLE hFile = CreateFileA(szFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hFile == INVALID_HANDLE_VALUE)
  Fatal(szFile, 1, "unable to open file (%x)", GetLastError());

szFile是由msbuild编译的dll / exe,它作为参数传递给程序。

我有时会看到以下错误:

unable to open file (20)

重建错误后再没有发生。根据Windows代码,错误代码20是:

ERROR_BAD_UNIT20 (0x14)

The system cannot find the device specified.

我不确定这是什么意思。似乎并不存在所讨论的文件,因为它确实存在。如果它没有错误代码将是" 2",我已经尝试过了。你知道什么会导致这个错误吗?感谢。

一些事情:

const char *szFile = nullptr;
...
szFile = argv[i]; // it loops over the arguments, parses them and finds the right argment for the file.
....
SetFileAttributes(szFile, FILE_ATTRIBUTE_NORMAL);
HANDLE hFile = CreateFileA(szFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hFile == INVALID_HANDLE_VALUE)
   Fatal(szFile, 1, "unable to open file (%x)", GetLastError());

Fatal()只执行文件名和消息的printf。

1 个答案:

答案 0 :(得分:2)

您以十六进制(%x)而不是十进制格式打印错误代码。

错误代码0x20(十进制32)是ERROR_SHARING_VIOLATION(“进程无法访问该文件,因为它正在被另一个进程使用。”)所以,是的,您对另一个打开文件的进程的猜测是正确的

在这种情况下,我怀疑是一种可能受病毒扫描影响的竞争状况。考虑让您的代码检测到此特定错误,并在短暂等待后重试。