Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cassert>
- #include <filesystem>
- #include <fstream>
- #include <iostream>
- #include <sstream>
- #include <string>
- #include <string_view>
- #include <vector>
- #include <algorithm>
- using namespace std;
- using filesystem::path;
- path operator""_p(const char* data, std::size_t sz) {
- return path(data, data + sz);
- }
- void PrintTree(ostream& dst, const path& p, int offset) {
- vector<filesystem::directory_entry> directories;
- for (const filesystem::directory_entry& dir_entry : filesystem::directory_iterator(p)) {
- // если объект - каталог
- if (dir_entry.is_directory()) {
- directories.push_back(dir_entry);
- PrintTree(cout, dir_entry.path(), offset + 2);
- }
- }
- sort(directories.begin(), directories.end(),
- [](const filesystem::directory_entry& lhs_dir, const filesystem::directory_entry& rhs_dir) {
- return lhs_dir.path().filename().string() > rhs_dir.path().filename().string();
- });
- for (const filesystem::directory_entry& dir_entry : directories) {
- dst << string(offset, ' ') << dir_entry.path().filename().string() << '\n';
- for (const filesystem::directory_entry& file : filesystem::directory_iterator(dir_entry.path())) {
- dst << string(offset + 2, ' ') << file.path().filename().string() << '\n';
- }
- }
- }
- void PrintTree(ostream& dst, const path& p) {
- dst << p.filename().string() << '\n';
- PrintTree(dst, p, 2);
- }
- int main() {
- error_code err;
- filesystem::remove_all("test_dir", err);
- filesystem::create_directories("test_dir"_p / "a"_p, err);
- filesystem::create_directories("test_dir"_p / "b"_p, err);
- ofstream("test_dir"_p / "b"_p / "f1.txt"_p);
- ofstream("test_dir"_p / "b"_p / "f2.txt"_p);
- ofstream("test_dir"_p / "a"_p / "f3.txt"_p);
- ostringstream out;
- PrintTree(out, "test_dir"_p);
- cout << out.str();
- assert(out.str() ==
- "test_dir\n"
- " b\n"
- " f2.txt\n"
- " f1.txt\n"
- " a\n"
- " f3.txt\n"sv
- );
- }
Advertisement
Add Comment
Please, Sign In to add comment