【问题标题】:ERROR_PATH_NOT_FOUND vs ERROR_FILE_NOT_FOUND, what is the difference?ERROR_PATH_NOT_FOUND 与 ERROR_FILE_NOT_FOUND,有什么区别?
【发布时间】:2012-03-07 10:01:57
【问题描述】:

当我尝试打开不存在的文件时,我通常会收到ERROR_FILE_NOT_FOUND,但现在fopen() 失败并且GetLastError() 返回ERROR_PATH_NOT_FOUND

那么ERROR_FILE_NOT_FOUNDERROR_PATH_NOT_FOUND有什么区别呢?

【问题讨论】:

    标签: c++ winapi windowserror


    【解决方案1】:

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

    这并没有特别说明问题。

    通常,“找不到文件”是指找不到文件本身的情况,“找不到路径”是指找不到路径的组成部分(指定的目录名称之一)的情况.

    【讨论】:

    • 谢谢。原来是因为我在路径内是 %appdata% 。似乎 fopen 不接受 envvars。
    【解决方案2】:

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

    特定的含义,与所有“通用”错误代码一样,高度依赖于被称为“产生”此错误的函数的实现。对于这方面的一个更糟糕的例子,请考虑错误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 映射到错误号ENOENT

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

    【讨论】:

    • +1 表示 fopen 和 CreateFile 的关系
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-19
      • 2013-03-14
      • 2018-09-14
      • 2014-01-03
      • 2021-12-22
      • 2017-10-25
      • 2011-06-09
      • 2021-05-11
      相关资源
      最近更新 更多