Seredenko-V

Untitled

Sep 25th, 2022 (edited)
270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | None | 0 0
  1. #include <cassert>
  2. #include <filesystem>
  3. #include <fstream>
  4. #include <iostream>
  5. #include <sstream>
  6. #include <string>
  7. #include <string_view>
  8. #include <vector>
  9. #include <algorithm>
  10.  
  11. using namespace std;
  12. using filesystem::path;
  13.  
  14. path operator""_p(const char* data, std::size_t sz) {
  15.     return path(data, data + sz);
  16. }
  17.  
  18. void PrintTree(ostream& dst, const path& p, int offset) {
  19.     vector<filesystem::directory_entry> directories;
  20.     for (const filesystem::directory_entry& dir_entry : filesystem::directory_iterator(p)) {
  21.         // если объект - каталог
  22.         if (dir_entry.is_directory()) {
  23.             directories.push_back(dir_entry);
  24.             PrintTree(cout, dir_entry.path(), offset + 2);
  25.         }
  26.     }
  27.  
  28.     sort(directories.begin(), directories.end(),
  29.         [](const filesystem::directory_entry& lhs_dir, const filesystem::directory_entry& rhs_dir) {
  30.             return lhs_dir.path().filename().string() > rhs_dir.path().filename().string();
  31.         });
  32.  
  33.     for (const filesystem::directory_entry& dir_entry : directories) {
  34.         dst << string(offset, ' ') << dir_entry.path().filename().string() << '\n';
  35.         for (const filesystem::directory_entry& file : filesystem::directory_iterator(dir_entry.path())) {
  36.             dst << string(offset + 2, ' ') << file.path().filename().string() << '\n';
  37.         }
  38.     }
  39. }
  40.  
  41. void PrintTree(ostream& dst, const path& p) {
  42.     dst << p.filename().string() << '\n';
  43.     PrintTree(dst, p, 2);
  44. }
  45.  
  46. int main() {
  47.     error_code err;
  48.     filesystem::remove_all("test_dir", err);
  49.     filesystem::create_directories("test_dir"_p / "a"_p, err);
  50.     filesystem::create_directories("test_dir"_p / "b"_p, err);
  51.  
  52.     ofstream("test_dir"_p / "b"_p / "f1.txt"_p);
  53.     ofstream("test_dir"_p / "b"_p / "f2.txt"_p);
  54.     ofstream("test_dir"_p / "a"_p / "f3.txt"_p);
  55.  
  56.     ostringstream out;
  57.     PrintTree(out, "test_dir"_p);
  58.     cout << out.str();
  59.     assert(out.str() ==
  60.         "test_dir\n"
  61.         "  b\n"
  62.         "    f2.txt\n"
  63.         "    f1.txt\n"
  64.         "  a\n"
  65.         "    f3.txt\n"sv
  66.     );
  67. }
  68.  
Advertisement
Add Comment
Please, Sign In to add comment