ERROR_PATH_NOT_FOUND vs ERROR_FILE_NOT_FOUND,有什么区别?

时间:2012-03-07 10:01:58

标签: c++ winapi windowserror

  

可能重复:
  What's the difference between PATH_NOT_FOUND and NAME_NOT_FOUND

当我尝试打开不存在的文件时,我通常会ERROR_FILE_NOT_FOUND,但现在fopen会因ERROR_PATH_NOT_FOUND而失败。

那么ERROR_FILE_NOT_FOUNDERROR_PATH_NOT_FOUND之间有什么区别?

3 个答案:

答案 0 :(得分:6)

WinError.h中,ERROR_FILE_NOT_FOUND包含描述性文字“系统无法找到指定的文件”。并且ERROR_PATH_NOT_FOUND具有描述性文本“系统无法找到指定的路径。”

这并没有特别澄清问题。

然而,通常,“找不到文件”是指无法找到文件本身并且“找不到路径”的情况是指无法找到路径的组件(指定的目录名之一)的情况

答案 1 :(得分:5)

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

特定的含义,与所有“通用”错误代码一样,在很大程度上取决于被称为“产生”此错误的函数的实现。对于这方面更糟糕的例子,考虑错误ERROR_INVALID_DATA - 只有函数的文档可以告诉它应该是什么。

这使我们指出fopen甚至没有(officially)返回或设置这些错误代码。 fopen是CRT库的一部分,因此记录使用其错误报告机制:errno

在CRT源代码中查看fopen的实现,你可以看到(最终,这是一个内部帮助函数的调用堆栈),最终调用fopen(不出意料) CreateFile Win32 API。然后,它会仔细地将CreateFile可能返回的错误映射到类似errno的错误(如果您仍想跟随CRT源,则使用内部_dosmaperr()函数)。这会将ERROR_FILE_NOT_FOUNDERROR_PATH_NOT_FOUND映射到errno ENOENT

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

答案 2 :(得分:2)

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