ERROR_PATH_NOT_FOUND与ERROR_FILE_NOT_FUND有什么区别

ERROR_PATH_NOT_FOUND vs ERROR_FILE_NOT_FOUND, what is the difference?

本文关键字:ERROR NOT 区别 什么 FUND PATH FOUND FILE      更新时间:2023-10-16

当我试图打开一个不存在的文件时,通常会得到ERROR_FILE_NOT_FOUND,但现在fopen()失败,GetLastError()返回ERROR_PATH_NOT_FOUND

那么ERROR_FILE_NOT_FOUNDERROR_PATH_NOT_FOUND之间有什么区别呢?

WinError.h中,ERROR_FILE_NOT_FOUND的描述性文本为"系统找不到指定的文件",而ERROR_PATH_NOT_FOUND的描述性文本则为"系统无法找到指定的路径"。

这并没有特别澄清问题。

然而,通常情况下,"找不到文件"是指找不到该文件本身的情况,而"找不到此路径"是指无法找到路径的组件(指定的目录名之一)的情况。

实际上,可以从错误代码的名称中推断出规范的含义。

与所有"通用"错误代码一样,特定的含义在很大程度上取决于据说"产生"此错误的函数的实现。对于这方面更糟糕的例子,请考虑错误ERROR_INVALID_DATA——只有函数的文档才能告诉它应该做什么

这使我们注意到fopen甚至不会(正式)返回或设置这些错误代码。fopen是CRT库的一部分,因此被记录为使用其错误报告机制:errno

查看CRT源代码中fopen的实现,您可以看到(最终,它相当于内部助手函数的调用堆栈),fopen最终调用(并不奇怪)CreateFileWin32 API。然后,它会小心地将CreateFile可能返回的错误映射为类似errno的错误(如果您仍然想在CRT源中使用内部_dosmaperr()函数)。这会将ERROR_FILE_NOT_FOUNDERROR_PATH_NOT_FOUND都映射到错误号ENOENT

因此,在fopen的上下文中,该区别最好被认为是无意义的,因为它是fopen的实现细节。

ERROR_PATH_NOT_FOUND表示容器目录不存在。ERROR_FILE_NOT_FOUND表示容器目录存在,并且不包含命名文件。

相关文章: