【发布时间】:2016-09-02 13:20:21
【问题描述】:
当使用 fopen 和 ifstream.open() 打开目录作为文件时,我试图从 errno 中获取正确的错误代码。我期待 EISDIR,我得到 EACCES。
我正在 Windows 7 x64 上使用 MSVC 12.0 工具链编译(和执行)。
我一直在阅读文章 (https://gehrcke.de/2011/06/reading-files-in-c-using-ifstream-dealing-correctly-with-badbit-failbit-eofbit-and-perror/),作者得到了输出“stream failbit (or badbit).error state: Is a directory”。
我使用 GCC 4.6(或更高版本,不确定 atm)编译了作者文件,并在传递目录作为参数时也得到了 EACCES。
我知道没有简单的方法来判断磁盘对象是否是 Windows 上的目录,所以没有得到 EISDIR 也不足为奇。
有什么可以做的(就是在 Windows 上获取 EISDIR)? 是否有其他 errno 以类似(意外)的方式表现?
【问题讨论】:
-
请照常提供minimal reproducible example。您也不能将目录作为文件打开。
-
我认为你不走运 - 我找不到 Microsoft C 库中引用的
EINVAL和is_a_directory符号(我检查了 VS 12.0 和通用 CRT 作为VS 14.0 使用)除了定义本身之外的任何地方,即它们存在但未使用。替代方案(MinGW 等)链接到 msvcrt.dll,您已经确认它的行为也不符合您的要求。 -
我认为使用 errno 检查设备对象是文件还是目录不是一个好的选择。由于此方法依赖于平台和编译器,因此不稳定,并且 C++ 标准没有说明处理 ifstream 错误的行为。
-
“很难判断磁盘对象是否是 Windows 上的目录”- 有一个相当简单的
GetFileAttributes( object ) & FILE_ATTRIBUTE_DIRECTORY。而MSVC有_stat()或_fstat,见st_mode & _S_IFDIR。 -
@πάνταῥεῖ 请使用 OP 链接中的源代码。如果你得到不同的结果,我很想知道。