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_FOUNDERROR_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_FOUNDERROR_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,有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

数据库模型图和ER图区别是啥?

mysql如何根据er图创建二维表

数据库设计与 ER 模型 - 数据库系统原理

er模型是反映数据库应用系统的啥模型

POW'ER炉火大辩论:分布式存储和中心化存储的博弈与融合

项目管理 - 用OT2ER原则提升项目质量与效率