我正在使用 C++ fstream 来读取配置文件。
#include <fstream>
std::ifstream my_file(my_filename);
现在,如果我传递一个目录的路径,它会默默地忽略它。例如my_file.good()
返回真,即使my_filename
是一个目录。由于这是我的程序的意外输入,我喜欢检查它并抛出异常。
如何检查刚刚打开的 fstream 是否为常规文件、目录或流?
我似乎无法找到一种方法:
- 从给定的 ifstream 中获取文件描述符。
- 使用其他机制在 ifstream 中查找此信息。
在一些论坛讨论中,有人建议两者都不可能,因为这取决于操作系统,因此永远不可能成为 fstream C++ 标准的一部分。
我能想到的唯一选择是重写我的代码以完全摆脱 ifstream 并诉诸文件描述符 ( *fp
) 的 C 方法,以及fstat()
:
#include <stdio.h>
#include <sys/stat.h>
FILE *fp = fopen(my_filename.c_str(), "r");
// skip code to check if fp is not NULL, and if fstat() returns != -1
struct stat fileInfo;
fstat(fileno(fp), &fileInfo);
if (!S_ISREG(fileInfo.st_mode)) {
fclose(fp);
throw std::invalid_argument(std::string("Not a regular file ") + my_filename);
}
我更喜欢fstream。因此,我的问题。