Daily bit(e) C++. std::filesystem::path, std::filesystem::directory_iterator

Добавлено 30 июля 2023 в 19:40

Daily bit(e) C++ #204. Поддержка работы с путями в файловой системе и связанного с этим функционала в C++17.

Daily bit(e) C++ #204. std::filesystem::path, std::filesystem::directory_iterator

Библиотека 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.

Теги

C++ / CppC++17Daily bit(e) C++filesystemSTL / Standard Template Library / Стандартная библиотека шаблоновПрограммированиеФайловая система

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.