shushus

Спринт 12. Тернистые пути: работаем с файловой системой.

Apr 6th, 2023
310
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.66 KB | None | 0 0
  1. #include <cassert>
  2. #include <filesystem>
  3. #include <fstream>
  4. #include <iostream>
  5. #include <sstream>
  6. #include <string>
  7. #include <vector>
  8. #include <algorithm>
  9. #include <string_view>
  10.  
  11. using std::filesystem::path;
  12.  
  13. path operator""_p(const char* data, std::size_t sz) {
  14.     return path(data, data + sz);
  15. }
  16.  
  17. void PrintTree(std::ostream& dst, const std::filesystem::path& p, const std::filesystem::file_status& status, int offset) {
  18.    
  19.     if (status.type() == std::filesystem::file_type::regular) {
  20.         dst << std::string (offset, ' ')
  21.             << std::string(p.filename()) << std::endl;
  22.        
  23.     } else if (status.type() == std::filesystem::file_type::directory) {
  24.         dst << std::string(offset, ' ')
  25.             << std::string(p.filename()) << std::endl;
  26.        
  27.         std::vector<std::filesystem::path> vector_path;
  28.        
  29.         for (const std::filesystem::path& dir_entry : std::filesystem::directory_iterator(p)) {
  30.             vector_path.push_back(dir_entry);
  31.         }
  32.        
  33.         std::sort(vector_path.begin(),
  34.                   vector_path.end(),
  35.                   [](std::filesystem::path lhs, std::filesystem::path rhs) {
  36.                      return std::lexicographical_compare(std::string(rhs.filename()).begin(),
  37.                                                          std::string(rhs.filename()).end(),
  38.                                                          std::string(lhs.filename()).begin(),
  39.                                                          std::string(lhs.filename()).end());
  40.                   });
  41.        
  42.         for (const std::filesystem::path& dir_entry : vector_path) {
  43.             std::error_code err;
  44.             auto new_status = std::filesystem::status(dir_entry, err);
  45.            
  46.             PrintTree(dst, dir_entry, new_status, offset + 2);
  47.         }
  48.     }
  49. }
  50.  
  51. void PrintTree(std::ostream& dst, const path& p) {
  52.     std::error_code err;
  53.     auto status = std::filesystem::status(p,err);
  54.    
  55.     PrintTree(dst, p, status, 0);
  56. }
  57.  
  58. int main() {
  59.     using namespace std::literals;
  60.    
  61.     std::error_code err;
  62.     std::filesystem::remove_all("test_dir", err);
  63.     std::filesystem::create_directories("test_dir"_p / "a"_p, err);
  64.     std::filesystem::create_directories("test_dir"_p / "b"_p, err);
  65.  
  66.     std::ofstream("test_dir"_p / "b"_p / "f1.txt"_p);
  67.     std::ofstream("test_dir"_p / "b"_p / "f2.txt"_p);
  68.     std::ofstream("test_dir"_p / "a"_p / "f3.txt"_p);
  69.  
  70.     std::ostringstream out;
  71.     PrintTree(out, "test_dir"_p);
  72.     assert(out.str() ==
  73.         "test_dir\n"
  74.         "  b\n"
  75.         "    f2.txt\n"
  76.         "    f1.txt\n"
  77.         "  a\n"
  78.         "    f3.txt\n"sv
  79.     );
  80. }
Advertisement
Add Comment
Please, Sign In to add comment