在Windows上的目录上使用fopen

时间:2016-09-02 13:20:21

标签: c++ windows file

我在使用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(或badbit)。错误状态:是一个目录”。

我使用GCC 4.6(或更高版本,不确定atm)编译了作者文件,并且在传递目录作为参数时,我也获得了EACCES。

我知道没有简单的方法来判断磁盘对象是否是Windows上的目录,因此不能获得EISDIR也不会太令人惊讶。

有什么可以做的吗(在Windows上获取EISDIR,那是)? 是否存在其他类似(意外)行为的错误?

2 个答案:

答案 0 :(得分:3)

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中。

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

答案 1 :(得分:-1)

fopen函数不是Windows API的一部分;它来自某些给定的C或C ++开发环境中的运行时支持库。

EISDIR错误适用于为Cygwin构建并随Cygnal一起提供的C应用程序:

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>

此语言中的open-file函数使用fopenget-string最终依赖于C stdio.h函数。 fopen成功,但后续输入尝试收到EISDIR错误。 (映射到与Linux和其他平台相同的传统21代码)。这变成了一个例外。 "Is a directory"字符串来自strerror

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