是否存在函数CreateFile返回INVALID_HANDLE_VALUE并且GetLastError()返回ERROR_ALREADY_EXISTS的情况

时间:2016-08-05 08:37:56

标签: windows createfile kernel32 getlasterror

我在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_ALWAYSOPEN_ALWAYS,则说

  

始终创建新文件。如果指定的文件存在且是   可写,函数覆盖文件,函数成功,和   最后错误代码设置为ERROR_ALREADY_EXISTS(183)。如果指定的话   文件不存在,是一个有效的路径,创建一个新文件,   函数成功,最后一个错误代码设置为零。更多   信息,请参阅本主题的备注部分。

  

始终打开文件。如果指定的文件存在,则为该函数   成功,最后一个错误代码设置为ERROR_ALREADY_EXISTS(183)。   如果指定的文件不存在并且是可写的有效路径   location,该函数创建一个文件,并设置最后一个错误代码   为零。

所以我不确定如果功能失败,GetLastError()ERROR_ALREADY_EXISTS吗?

请给我一个例子。

非常感谢。

2 个答案:

答案 0 :(得分:2)

快速回答:否。

根据指定:

ERROR_ALREADY_EXISTS只有当{/ 1}}调用时才会GetLastError()返回CreateFile()仅当文件存在时,dwCreationDisposition设置为{{1} }或CREATE_ALWAYSOPEN_ALWAYS 成功

如果CreateFile()CreateFile()CREATE_ALWAYS设置为OPEN_ALWAYS而失败,则dwCreationDisposition将返回相应的最后错误代码,指明文件的原因无法打开,但不能像用户明确要求打开或创建文件那样GetLastError(),无论它是否存在。

ERROR_ALREADY_EXISTS GetLastError()设置为CreateFile()因文件存在而失败时,不应将其与dwCreationDisposition的返回值混淆。在这种情况下,CREATE_NEW将返回GetLastError()永远不会 ERROR_FILE_EXISTS

答案 1 :(得分:0)

显然,您可以使用OPEN_ALWAYS调用CreateFile失败,返回失败的是NULL句柄,并收到错误183。当我使用OPEN_ALWAYS调用CreateFile并指定目录中不退出的文件时,会发生这种情况。

示例: C:\NonExistingDirectory\Myfile.txt

我不确定在不同的Windows版本上这是否是一致的行为。我是使用Visual Studio 2015在Windows 10上获得的。