Daily bit(e) C++. std::filesystem::path, std::filesystem::directory_iterator
Daily bit(e) C++ #204. Поддержка работы с путями в файловой системе и связанного с этим функционала в C++17.
Библиотека filesystem
в C++17 ввела понятие пути в файловой системе.
Пути могут быть преобразованы в их абсолютные, канонические и относительные формы и проверены на эквивалентность для всех этих типов.
Пути, которые ссылаются на каталоги, можно исследовать с помощью итераторов каталогов либо только для этого каталога, либо рекурсивно.
#include <filesystem>
#include <cassert>
std::filesystem::path local(".");
// перебрать записи в каталоге, который задан с помощью пути
for (const auto& entry : std::filesystem::directory_iterator(local))
{
auto p1 = entry.path(); // например, ./file.ext
auto p2 = absolute(entry.path()); // например, /some/path/./file.ext
auto p3 = canonical(entry.path()); // например, /some/path/file.ext
// пути можно проверить на эквивалентность
// (только для действительных путей)
assert(equivalent(p1,p2));
assert(equivalent(p2,p3));
}
// рекурсивно перебрать записи в каталоге, который задан с помощью пути
for (const auto& entry :
std::filesystem::recursive_directory_iterator(local))
{
auto p1 = entry.path(); // например, ./file.ext
auto p2 = absolute(entry.path()); // например, /some/path/./file.ext
auto p3 = canonical(entry.path()); // например, /some/path/file.ext
}
// Относительные пути
std::filesystem::path a("/some/file/path");
std::filesystem::path b("/some/other/path");
std::filesystem::path c = relative(a,b);
// c == "../../file/path"
Открыть пример на Compiler Explorer.