В C++17 добавлено новое пространство имен std::filesystem. На мой взгляд он предоставляет удобный интерфейс для работы с файловой системой. Тогда как раньше приходилось складывать строки и вызывать си функции для манипуляций атрибутами файлов.
Как компилить?
- Установить С++17
- Указать линковщику флаг -lstdc++fs
Начинаем эксперементировать
Для удобства я переопределил namespace. (все так делают)
Первый пример
Сущность fs::path представляет путь к объектам файловой системы. И некоторые его методы.
На выходе получим информацию о заданном пути и файле.
parent_path: "./path"
extension: ".txt"
filename: "file.txt"
root_name: ""
has_relative_path: 1
has_root_directory: 0
Кроссплатформенный разделитель
Раньше для определения разделителя в зависимости от операционной системы приходилось выкручиватся применением условных директив. Сейчас для этой цели можно применить следующий метод.
Output:
preferred_separator: /
Применение перегруженного знака деления для получения полного пути.
Как по мне такой способ удобен тем, что при чтении, код явно говорит нам, что мы работаем с файловой системой уже в привычном нам виде.
Output:
path_to_site_conf: "/etc/httpd/sites-enabled/site.conf"
Рекурсивное создание и удаление каталогов
Output:
banana/apple:
. .. kiwi
banana/cocosa:
. .. mango
ls: cannot access 'banana/*': No such file or directory