ERROR_PATH_NOT_FOUND 与 ERROR_FILE_NOT_FOUND,有啥区别?
Posted
技术标签:
【中文标题】ERROR_PATH_NOT_FOUND 与 ERROR_FILE_NOT_FOUND,有啥区别?【英文标题】: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_FOUND
和ERROR_PATH_NOT_FOUND
有什么区别呢?
【问题讨论】:
【参考方案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_FOUND
和ERROR_PATH_NOT_FOUND
映射到错误号ENOENT
。
因此,在fopen
的上下文中,最好将区别视为毫无意义,因为它是fopen
的实现细节。
【讨论】:
+1 表示 fopen 和 CreateFile 的关系【参考方案3】:ERROR_PATH_NOT_FOUND
表示容器目录不存在。
ERROR_FILE_NOT_FOUND
表示容器目录存在,不包含命名文件。
【讨论】:
以上是关于ERROR_PATH_NOT_FOUND 与 ERROR_FILE_NOT_FOUND,有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章