在windows上对目录使用fopen
Using fopen on a directory on windows
我试图在打开目录作为文件时从errno中获得正确的错误代码,无论是使用fopen还是使用ifstream.open()。我期望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/)中阅读,作者得到了输出"流failbit(或badbit)"。错误状态:Is a directory".
我用GCC 4.6(或更高版本,不确定atm)编译了作者文件,在传递目录作为参数时,我也得到了EACCES。
我知道没有简单的方法来判断一个磁盘对象是否是windows上的目录,所以没有得到EISDIR并不奇怪。
有什么可以做的关于它(获得EISDIR在windows上,也就是说)?是否有其他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
中有它。
这两个文件都包含一个错误表,将操作系统错误码映射到C库错误码。您可以使用它来确认一个特定的映射是否符合您的期望。
fopen
函数不是Windows API的一部分;它来自某个给定的C或c++开发环境的运行时支持库。
这个EISDIR
错误在为Cygwin构建并随Cygnal一起发布的C应用程序中工作:
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支持更好的功能。
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 在Linux for Windows上编译C++代码时出错
- 在Windows上用C++裁剪HBITMAP
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- Windows/Cygwin - 不能使用 pybind11 - 犯错误
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 在Windows中以.exe的形式运行c++
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 无法在windows控制台中为C++程序提供必要的输入
- 使用fopen打开文件,在Windows上给定绝对路径
- windows server 2008上的c++ fopen错误
- 为什么在Windows上std::fopen和std::filebuf::open会裁剪尾随空格字符
- fopen在将控制台应用程序更改为windows应用程序后失败
- fopen和windows控制台的问题
- 在windows上对目录使用fopen
- 如何使用fopen在Windows通用应用程序中打开和读取文件