【发布时间】:2012-03-07 10:01:57
【问题描述】:
当我尝试打开不存在的文件时,我通常会收到ERROR_FILE_NOT_FOUND,但现在fopen() 失败并且GetLastError() 返回ERROR_PATH_NOT_FOUND。
那么ERROR_FILE_NOT_FOUND和ERROR_PATH_NOT_FOUND有什么区别呢?
【问题讨论】:
标签: c++ winapi windowserror
当我尝试打开不存在的文件时,我通常会收到ERROR_FILE_NOT_FOUND,但现在fopen() 失败并且GetLastError() 返回ERROR_PATH_NOT_FOUND。
那么ERROR_FILE_NOT_FOUND和ERROR_PATH_NOT_FOUND有什么区别呢?
【问题讨论】:
标签: c++ winapi windowserror
在WinError.h 中,ERROR_FILE_NOT_FOUND 具有描述性文本“系统找不到指定的文件”。并且ERROR_PATH_NOT_FOUND 具有描述性文本“系统找不到指定的路径。”
这并没有特别说明问题。
通常,“找不到文件”是指找不到文件本身的情况,“找不到路径”是指找不到路径的组成部分(指定的目录名称之一)的情况.
【讨论】:
实际上,可以从错误代码的名称中推断出规范的含义。
特定的含义,与所有“通用”错误代码一样,高度依赖于被称为“产生”此错误的函数的实现。对于这方面的一个更糟糕的例子,请考虑错误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 的实现细节。
【讨论】:
ERROR_PATH_NOT_FOUND 表示容器目录不存在。
ERROR_FILE_NOT_FOUND 表示容器目录存在,不包含命名文件。
【讨论】: