Класс std::ifstream, метод получения имени файла

279
15 мая 2017, 01:15

Доброго времени суток. Покопал много страницы учебников/интернета, но так и ничего не нашёл. Иногда требуется получить имя файла, к которому привязан файловый поток. Неужели нет ни функций\ни методов чтобы такое провернуть?\n Заранее спасибо. Пока что спасаюсь немного костыльно:

class File :public std::ifstream 
{
    std::string name;
public:
    File():name(""), std::ifstream(){}
    File(const char* n, ios_base::openmode m = ios_base::in | ios_base::out):name(n), std::ifstream(n, m){}
    std::string name_file()
    {
        return this->name;
    }
};
Answer 1

Пожалуй, лучшее, что вы можете сделать - самостоятельно хранить имя.

Поскольку в стандарте об этом ничего не сказано - как минимум вы не можете получить имя файла переносимо. Вряд ли его какая-то реализация вообще хранит.

Даже просто найти по дескриптору операционной системы имя файла - задача нетривиальная (и не уверен, что вообще везде разрешимая).

Кстати, представим себе символические линки (или hard линки) - и какое имя файла теоретически нужно возвращать? А файл к тому же - еще и не всегда именно дисковый файл - например, откройте в Windows fstream с именем con - вывод пойдет на консоль. Можно отправить на принтер или еще куда.

Как я понимаю, все эти соображения вкупе с тем, что вы-то знаете, что открывали - привели к тому, что ни в C, ни в C++ нет функций получения имени файла из файлового объекта/потока.

READ ALSO
Создание собственного списка c++

Создание собственного списка c++

Здравствуйте, я пытаюсь воспроизвести похожее на list из библиотеки stl

321
Перегрузка operator[]

Перегрузка operator[]

Вот часть кода, помогите пожалуйста реализовать перегрузку оператора []

219
Умножение в столбик

Умножение в столбик

Как написать оператор *= для длинных беззнаковых чисел методом умножения в столбик (длинная арифметика) без использования оператора *, если...

300
Проблема с компиляцией, С++, error 4

Проблема с компиляцией, С++, error 4

Есть проект на C++ при компиляции, которого при использование версии g++ (gcc) 49

282