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
("Процесс не может получить доступ к файлу, потому что он используется другим процессом.") Итак, да, ваше предположение о том, что другой процесс открыл файл, было верным.
В этих обстоятельствах я подозреваю состояние гонки, возможно, затронутое сканированием на вирусы. Подумайте, чтобы ваш код обнаружил эту конкретную ошибку и повторите попытку после небольшого ожидания.