Есть ли ситуация, когда функция CreateFile возвращает INVALID_HANDLE_VALUE, а GetLastError() возвращает ERROR_ALREADY_EXISTS?
Я искал MSDN о
HANDLE WINAPI CreateFile(
_In_ LPCTSTR lpFileName,
_In_ DWORD dwDesiredAccess,
_In_ DWORD dwShareMode,
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
_In_ DWORD dwCreationDisposition,
_In_ DWORD dwFlagsAndAttributes,
_In_opt_ HANDLE hTemplateFile
);
и если dwCreationDisposition
== CREATE_ALWAYS
или же OPEN_ALWAYS
это говорит
Создает новый файл, всегда. Если указанный файл существует и доступен для записи, функция перезаписывает файл, функция завершается успешно, и для кода последней ошибки установлено значение ERROR_ALREADY_EXISTS (183). Если указанный файл не существует и является допустимым путем, создается новый файл, функция завершается успешно, а код последней ошибки устанавливается равным нулю. Для получения дополнительной информации см. Раздел "Примечания" этой темы.
а также
Открывает файл всегда. Если указанный файл существует, функция завершается успешно, а код последней ошибки устанавливается в ERROR_ALREADY_EXISTS (183). Если указанный файл не существует и является допустимым путем к доступному для записи местоположению, функция создает файл, а код последней ошибки устанавливается равным нулю.
Так что я не уверен, что если функция не сработает, будет GetLastError()
быть ERROR_ALREADY_EXISTS
?
Пожалуйста, дайте мне пример, если так.
Большое спасибо.
3 ответа
Быстрый ответ: Нет.
Согласно тому, что указано:
ERROR_ALREADY_EXISTS
должен быть возвращен GetLastError()
сразу после CreateFile()
вызывать только тогда, когда файл существует, dwCreationDisposition
установлен в CREATE_ALWAYS
или же OPEN_ALWAYS
и CreateFile()
успешно
Если CreateFile()
не удается с CREATE_ALWAYS
или же OPEN_ALWAYS
установить как dwCreationDisposition
, затем GetLastError()
должен вернуть соответствующий код последней ошибки, указывающий причину, по которой файл не может быть открыт, но это не может быть ERROR_ALREADY_EXISTS
поскольку пользователь специально запросил открыть или создать файл, независимо от того, существует он или нет.
Это не следует путать с возвращаемым значением GetLastError()
когда звонок CreateFile()
с dwCreationDisposition
установлен в CREATE_NEW
не удается, потому что файл существует. В этом случае, GetLastError()
должен вернуться ERROR_FILE_EXISTS
и никогда ERROR_ALREADY_EXISTS
,
Да. С перерывами.
Я получаю жалобы пользователей на прерывистую проблему. Я отследил его до следующего вызова в нашем коде.
HANDLE hInputFile = ::CreateFile("path_to_file_i_want_to_read",
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_READONLY,
NULL);
Иногда (до сих пор не понимаю почему, не все пользователи сообщают о проблеме) этот вызов возвращаетсяINVALID_HANDLE_VALUE
. Код ошибки183 "Cannot create a file when that file already exists"
. Что глупо, потому что я пытаюсь открыть файл, который был создан несколько минут назад (он существует), и я хочу его прочитать.
По-видимому, у вас может быть вызов CreateFile с OPEN_ALWAYS с ошибкой возврата NULL дескриптора и получением ошибки 183. Это происходит со мной, когда я вызываю CreateFile с OPEN_ALWAYS, указывая файл в каталоге, который не завершается.
пример:C:\NonExistingDirectory\Myfile.txt
Я не уверен, что это одинаковое поведение в разных версиях Windows. Получил на Windows 10 с помощью Visual Studio 2015.