尝试使用 CreateFileW 打开路径时,ERROR_ACCESS_DENIED是否始终指示该文件存在?



>当将CreateFileWOPEN_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 完全返回给您该文件存在 - 在您获得此代码时 - 文件可能已经被删除。 反之亦然。 所以问题 - 这到底需要什么。

相关内容

最新更新