#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';