C++ 在windows上的目录上使用fopen

C++ 在windows上的目录上使用fopen,c++,windows,file,C++,Windows,File,当使用fopen和ifstream.open()以文件形式打开目录时,我试图从errno中获取正确的错误代码。我期待艾斯迪尔,我得到了一切 我正在Windows7x64上使用MSVC12.0工具链编译(和执行) 我一直在阅读文章(),作者在文章中得到了输出“streamfailbit(或badbit)。错误状态:是一个目录” 我用GCC4.6(或更高版本,不一定是atm)编译了作者文件,并且在传递一个目录作为参数时,我也得到了EACCES 我知道没有简单的方法可以判断磁盘对象是否是windows

当使用fopen和ifstream.open()以文件形式打开目录时,我试图从errno中获取正确的错误代码。我期待艾斯迪尔,我得到了一切

我正在Windows7x64上使用MSVC12.0工具链编译(和执行)

我一直在阅读文章(),作者在文章中得到了输出“streamfailbit(或badbit)。错误状态:是一个目录”

我用GCC4.6(或更高版本,不一定是atm)编译了作者文件,并且在传递一个目录作为参数时,我也得到了EACCES


我知道没有简单的方法可以判断磁盘对象是否是windows上的目录,所以不获取EISDIR也就不足为奇了

有什么可以做的吗(就是在windows上获取EISDIR)?
是否有其他错误以类似(意外)的方式运行?

Microsoft的C运行时库定义,但不使用
EISDIR
符号。所以你不会从他们那里得到错误代码。要获得另一个问题的答案,您需要查看C库源代码。它随Visual Studio一起提供,如果是Visual Studio 2015或更高版本,则随Windows SDK一起提供

在使用通用CRT的Visual Studio 2015(14.0)中,您需要的文件名为
errno.cpp
,它包含在Windows SDK中,我在
c:\Program Files(x86)\Windows Kits\10\Source\10.0.10586.0\ucrt\misc\errno.cpp
中有它

在Visual Studio 2013(12.0)中,您需要的文件名为
dosmap.c
,它包含在Visual Studio安装目录的VC子目录中,我在
c:\Program Files(x86)\Microsoft Visual Studio 12.0\VC\crt\src\dosmap.c
中找到了它


这两个文件都包含一个将OS错误代码映射到C库错误代码的错误表。您可以使用它来确认特定映射是否符合您的期望。

fopen函数不是Windows API的一部分;它来自于某个C或C++开发环境的运行时支持库。 此
EISDIR
错误适用于为Cygwin构建的C应用程序,并随附:

c:\users\kaz>txr
这是TXR 148的TXR Lisp交互式侦听器。
使用:quit命令或在空行上键入Ctrl-D退出。
1> (打开文件“”)
#
2> (获取字符串*1)
**读取#:21/“是目录”时出错
**在表单的expr-2:1求值期间(获取字符串*1)
3>
这种语言中的
openfile
函数使用
fopen
,而
get string
最终依赖于C
stdio.h
函数。
fopen
成功,但随后的输入尝试收到
EISDIR
错误。(映射到与Linux和其他平台上相同的传统21代码)。这就变成了一个例外。
“是一个目录”
字符串来自
strerror


您只需要一个功能更丰富的C运行时库,它比Microsoft Visual Studio提供的微不足道的产品具有更好的POSIX支持。

请像往常一样提供。你也不能以文件的形式打开目录。我想你运气不好-我在任何地方都找不到Microsoft C库中引用的
EINVAL
is\u a\u目录
符号(我检查了VS 12.0 one和VS 14.0使用的通用CRT),除了定义本身,也就是说,它们在那里,但没有被使用。备选方案(MinGW等)链接到msvcrt.dll,并且您已经确认它的行为也不符合您的要求。我认为使用errno检查设备对象是文件还是目录不是一个好选择。这种方法不稳定,因为这种方法依赖于平台和编译器,C++标准没有声明处理流错误的行为。“没有简单的方法来告诉一个磁盘对象是否是Windows上的目录”——有相当简单的<代码> GETFILIGATIONS(对象)和FILEAITIDETIORE目录< /代码>。MSVC具有
\u stat()
\u fstat
,请参见
st_模式和S_IFDIR
@πάνταῥεῖ 请使用来自OP链接的源代码。如果你得到不同的结果,我很想知道。所以Windows上没有EISDIR。。。谢谢你的澄清。
c:\users\kaz>txr
This is the TXR Lisp interactive listener of TXR 148.
Use the :quit command or type Ctrl-D on empty line to exit.
1> (open-file ".")
#<file-stream . 6fffff00738>
2> (get-string *1)
** error reading #<file-stream . 6fffff00738>: 21/"Is a directory"
** during evaluation at expr-2:1 of form (get-string *1)
3>