1

我搜索了 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_ALWAYSor OPEN_ALWAYS,它说

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

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

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

如果是,请给我一个例子。

非常感谢。

4

2 回答 2

2

快速回答:没有。

根据规定:

ERROR_ALREADY_EXISTS仅当文件存在,设置为or并且成功时,才应在调用GetLastError()后立即返回。CreateFile()dwCreationDispositionCREATE_ALWAYSOPEN_ALWAYSCreateFile()

如果CreateFile()失败CREATE_ALWAYSOPEN_ALWAYS设置为dwCreationDispositionGetLastError()则应返回适当的最后错误代码,指示无法打开文件的原因,但这不能ERROR_ALREADY_EXISTS因为用户特别要求打开或创建文件,无论它是否存在。

这不应与由于文件存在而GetLastError()调用CreateFile()with dwCreationDispositionset toCREATE_NEW失败时的返回值相混淆。在这种情况下,GetLastError()将返回ERROR_FILE_EXISTS并且永远不会 ERROR_ALREADY_EXISTS

于 2016-08-05T09:46:35.243 回答
0

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

例子: C:\NonExistingDirectory\Myfile.txt

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

于 2020-02-19T19:33:41.280 回答