我在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)。 如果指定的文件不存在并且是可写的有效路径 location,该函数创建一个文件,并设置最后一个错误代码 为零。
所以我不确定如果功能失败,GetLastError()
会ERROR_ALREADY_EXISTS
吗?
请给我一个例子。
非常感谢。
答案 0 :(得分:2)
快速回答:否。
根据指定:
ERROR_ALREADY_EXISTS
只有当{/ 1}}调用时才会GetLastError()
返回CreateFile()
仅当文件存在时,dwCreationDisposition
设置为{{1} }或CREATE_ALWAYS
和OPEN_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上获得的。