在Windows上使用fopen目录
我试图用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/),其中作者得到了输出“流失败位(或badbit)。错误状态:是一个目录”。
我使用GCC 4.6(或更高版本,不确定atm)编译了作者文件,并将一个目录作为参数传递给EACCES。
我知道没有简单的方法来告诉磁盘对象是否是Windows上的目录,所以没有获得EISDIR并不令人感到意外。
有什么可以做到的(在Windows上获得EISDIR,即)? 还有其他errno的行为是否类似(意外)?
微软的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 Kits10Source10.0.10586.0ucrtmiscerrno.cpp
。
在Visual Studio 2013(12.0)中,所需的文件名为dosmap.c
,它包含在Visual Studio安装目录的VC子目录中,我在C:Program Files (x86)Microsoft Visual Studio 12.0VCcrtsrcdosmap.c
。
这两个文件都包含一个将OS错误代码映射到C库错误代码的错误表。 你可以用它来确认一个特定的映射是否符合你的期望。
fopen
函数不是Windows API的一部分; 它来自某些给定的C或C ++开发环境的运行时支持库。
这个EISDIR
错误在为Cygwin构建的C应用程序中运行,并随Cygnal一起提供:
c:userskaz>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
函数使用fopen
, get-string
最终依赖于C stdio.h
函数。 fopen
成功,但随后的输入尝试收到EISDIR
错误。 (映射到与Linux和其他平台上相同的传统21代码)。 这变成了一个例外。 "Is a directory"
字符串来自strerror
。
您只需要一个功能更强大的C运行时库,它具有比Microsoft Visual Studio提供的微软产品更好的POSIX支持。
链接地址: http://www.djcxy.com/p/61309.html