Есть ли ситуация, когда функция 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.

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