Я использую C++ fstream для чтения конфигурационного файла.Проверьте, является ли fstream файлом или каталогом
#include <fstream>
std::ifstream my_file(my_filename);
Прямо сейчас, если я передаю путь к каталогу, он молча игнорирует это. Например. my_file.good()
возвращает true, даже если my_filename
- это каталог. Поскольку это непреднамеренный ввод для моей программы, мне нравится проверять ее и вызывать исключение.
Как проверить, что только что открытый fstream является обычным файлом, каталогом или потоком?
Я не могу показаться, чтобы найти способ либо:
- получить дескриптор файла из заданного ifstream.
- использовать какой-либо другой механизм, чтобы найти эту информацию в ifstream.
В some forum discussion было высказано предположение, что это невозможно, поскольку это зависит от ОС и, следовательно, никогда не может быть частью стандартного стандарта C++.
Единственной альтернативой я могу думать о том, чтобы переписать свой код, чтобы избавиться от ifstream вообще и прибегать к С-методом дескриптора файла (*fp
), наряду с 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. Следовательно, мой вопрос.
Какая стандартная реализация библиотеки и какая операционная система? Мне трудно поверить, что что-то может пойти так же плохо, как вы описываете. 'good()' должен возвращать false, если 'myfilename' является каталогом. –
Я использую OS X, 10.10, C++ 11. – MacFreek
Я считаю, что старые (или, кажется, не такие старые) Unix-производные разрешали открывать каталоги как файлы для чтения их содержимого, поэтому, хотя это удивительно, это не удивительно. BTW: Каково содержимое этого каталога, если вы читаете его с помощью 'fstream'? –