【问题标题】:Is there a situation that the function CreateFile returns INVALID_HANDLE_VALUE and GetLastError() returns ERROR_ALREADY_EXISTS是否存在函数 CreateFile 返回 INVALID_HANDLE_VALUE 而 GetLastError() 返回 ERROR_ALREADY_EXISTS 的情况
【发布时间】:2016-08-05 08:37:56
【问题描述】:

我在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)。 如果指定的文件不存在并且是可写文件的有效路径 位置,该函数创建一个文件并设置最后一个错误代码 归零。

所以我不确定如果函数失败,GetLastError() 会是ERROR_ALREADY_EXISTS 吗?

如果有,请举个例子。

非常感谢。

【问题讨论】:

    标签: windows createfile kernel32 getlasterror


    【解决方案1】:

    快速回答:不。

    根据规定:

    ERROR_ALREADY_EXISTS 应在 CreateFile() 调用后立即由 GetLastError() 返回@成功

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

    当调用CreateFile() 并将dwCreationDisposition 设置为CREATE_NEW 失败时,这不应与GetLastError() 的返回值混淆,因为文件存在。在这种情况下,GetLastError() 将返回 ERROR_FILE_EXISTS 并且从不 ERROR_ALREADY_EXISTS

    【讨论】:

      【解决方案2】:

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

      示例: C:\NonExistingDirectory\Myfile.txt

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

      【讨论】:

        猜你喜欢
        • 2011-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-13
        • 1970-01-01
        相关资源
        最近更新 更多