CreateFileA периодически возвращает ошибку 20 "Система не может найти указанное устройство"

Я отлаживаю пользовательский исполняемый файл во время компиляции моего кода с помощью задачи msbuild exec.

Он запускает следующий код:

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 - это dll/exe, скомпилированная msbuild, которая передается программе в качестве аргумента.

Иногда я вижу следующую ошибку:

unable to open file (20)

После восстановления ошибка больше не повторяется. Согласно кодам окон, код ошибки 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 () просто печатает имя файла и сообщение.

1 ответ

Решение

Вы печатаете код ошибки в шестнадцатеричном (%x), а не в десятичной.

Код ошибки 0x20 (32 знака после запятой) ERROR_SHARING_VIOLATION ("Процесс не может получить доступ к файлу, потому что он используется другим процессом.") Итак, да, ваше предположение о том, что другой процесс открыл файл, было верным.

В этих обстоятельствах я подозреваю состояние гонки, возможно, затронутое сканированием на вирусы. Подумайте, чтобы ваш код обнаружил эту конкретную ошибку и повторите попытку после небольшого ожидания.

Другие вопросы по тегам