>当将CreateFileW
与OPEN_EXISTING
一起使用时,它有时会因ERROR_ACCESS_DENIED
而失败。据我所知,这始终意味着该文件存在,但无论出于何种原因您都无法打开它。但是,是否有任何情况下它可能因ERROR_ACCESS_DENIED
而失败但该文件不存在?
一般来说 - 是的。CreateFileW
调用ERROR_ACCESS_DENIED
表示文件或文件夹存在。然而,错误的根源 - 是NTSTATUS
代码,而不是转换为Win32代码。这里的问题经常将多个不同的NTSTATUS
转换为单个Win32错误代码。特别是对于ERROR_ACCESS_DENIED
(不少于25种不同的状态转换为单个代码5 -ERROR_ACCESS_DENIED
)。对于获取源代码NTSTATUS
最好直接调用本机 API 或就地(或一起)RtlGetLastNtStatus()
GetLastError
。
例如CreateFileW
通常使用FILE_NON_DIRECTORY_FILE
选项调用NtCreateFile
(如果您没有设置FILE_FLAG_BACKUP_SEMANTICS
标志),如果给定名称存在文件夹(目录) - 将返回状态STATUS_FILE_IS_A_DIRECTORY
。 当然,从意义上讲,这与拒绝访问没有任何共同之处,但会转换为ERROR_ACCESS_DENIED
。
特殊(未记录)系统 API:
NTSYSAPI BOOLEAN NTAPI RtlDoesFileExists_U ( _In_ PWSTR FileName )
相信如果文件(在调用ZwQueryAttributesFile
之后)获得STATUS_ACCESS_DENIED
状态(请注意STATUS_ACCESS_DENIED
不等于ERROR_ACCESS_DENIED
),则该文件存在,所以我认为做同样的事情就足够正确了(但检查状态而不是Win32错误)。
最后,这里总是存在设计上的竞争条件。 即使 API 完全返回给您该文件存在 - 在您获得此代码时 - 文件可能已经被删除。 反之亦然。 所以问题 - 这到底需要什么。