Получение пути к рекурсивно повторяющимся каталогам относительно указанного пути входа

#c #std #std-filesystem

#c #std #std-файловая система

Вопрос:

Рассмотрим пример в документации std::filesystem::recursive_directory_iterator :

 #include <fstream>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
 
int main()
{
    fs::current_path(fs::temp_directory_path());
    fs::create_directories("sandbox/a/b");
    std::ofstream("sandbox/file1.txt");
    fs::create_symlink("a", "sandbox/syma");
    for(autoamp; p: fs::recursive_directory_iterator("sandbox"))
        std::cout << p.path() << 'n';
    fs::remove_all("sandbox");
}
 

Возможный вывод:

 "sandbox/a"
"sandbox/a/b"
"sandbox/file1.txt"
"sandbox/syma"
 

Я хотел бы удалить из вывода sandbox/ префикс, который был указан при построении recursive_directory_iterator , например:

 "a"
"a/b"
"file1.txt"
"syma"
 

Я просмотрел документацию, но не смог найти ничего подходящего.

Небольшая обработка строк не имеет большого значения, но мне не нравится вводить код несколько более низкого уровня, выполняя цикл от путей к строкам. Действительно ли это единственный шанс?

Комментарии:

1. Не могли бы вы использовать std::filesystem::relative ? Пример для внутри цикла for: const auto base_path = fs::current_path().append("sandbox"); const auto relative_path = fs::relative(p.path(), base_path); std::cout << relative_path << 'n'; .

2. @Lily relative — отличный совет. Это может быть применено очень простым способом: std::cout << fs::relative(p.path(), "sandbox") << 'n'; это все, что мне было нужно. Если вы дадите такой ответ, я был бы рад проголосовать и принять.

3. Теперь я опубликовал его в качестве ответа и использовал более короткий синтаксис, который вы нашли

Ответ №1:

Вы можете использовать std::filesystem::relative , это может выглядеть так:

 std::cout << fs::relative(p.path(), "sandbox") << 'n';