Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2019
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.65 KB | None | 0 0
  1. #include <iostream>
  2. #include <dirent.h>
  3. #include <string>
  4. #include <cstring>
  5. #include <list>
  6. #include <algorithm>
  7.  
  8. int rec_dir(const char *dirfirst, std::string viewstr)
  9. {
  10.     DIR *dir;
  11.     struct dirent *entry;
  12.  
  13.     dir = opendir(dirfirst);
  14.     if (!dir)
  15.     {
  16.         perror("diropen");
  17.         exit(1);
  18.     }
  19.  
  20.     std::list<std::string> *files = new std::list<std::string>;
  21.     std::list<std::string> *dirs = new std::list<std::string>;
  22.     std::list<std::string>::iterator iter;
  23.     std::string *str1 = new std::string;
  24.     std::string *str2 = new std::string;
  25.     while ((entry = readdir(dir)) != NULL)
  26.     {
  27.         *str2 = entry->d_name;
  28.         std::transform(str2->begin(), str2->end(), str2->begin(), [](unsigned char c){return std::tolower(c);});
  29.         if (entry->d_type == DT_DIR)
  30.         {
  31.             iter = dirs->begin();
  32.             do
  33.             {
  34.                 if (dirs->empty())
  35.                 {
  36.                     dirs->push_back(entry->d_name);
  37.                     break;
  38.                 }
  39.                 if (entry->d_name < *iter)  
  40.                 {
  41.                     dirs->insert(iter, entry->d_name);
  42.                     break;
  43.                 }
  44.                 iter++;
  45.                 if (iter == dirs->end()) dirs->push_back(entry->d_name);
  46.             } while (iter != dirs->end());
  47.         }
  48.         else
  49.         {
  50.             iter = files->begin();
  51.             do
  52.             {
  53.                 if (files->empty())
  54.                 {
  55.                     files->push_back(entry->d_name);
  56.                     break;
  57.                 }
  58.                 *str1 = *iter;
  59.                 std::transform(str1->begin(), str1->end(), str1->begin(), [](unsigned char c){return std::tolower(c);});
  60.                 if (*str1 > *str2)
  61.                 {
  62.                     files->insert(iter, entry->d_name);
  63.                     break;
  64.                 }
  65.                 iter++;
  66.                 if (iter == files->end()) files->push_back(entry->d_name);
  67.             } while (iter != files->end());
  68.         }
  69.     }
  70.  
  71.     std::list<std::string>::iterator iter1;
  72.     iter = dirs->begin();
  73.     iter++;
  74.     iter++;
  75.     std::string *dirnext = new std::string;
  76.  
  77.     while (iter != dirs->end())
  78.     {
  79.         iter1 = iter;
  80.         if (++iter1 == dirs->end() && files->empty()) viewstr.replace(viewstr.length()-9, 3, "┗");
  81.         std::cout << viewstr << " " << *iter << '\n';
  82.         viewstr.replace(viewstr.length()-9, 3, "┣");
  83.         *dirnext = dirfirst;
  84.         *dirnext += "/";
  85.         *dirnext += *iter;
  86.         rec_dir(dirnext->c_str(), "┃   " + viewstr);
  87.         iter++;
  88.     }
  89.     viewstr.replace(viewstr.length()-9, 3, "┣");
  90.     iter = files->begin();
  91.     while (iter != files->end())
  92.     {
  93.         iter1 = iter;
  94.         if (++iter1 == files->end()) viewstr.replace(viewstr.length()-9, 3, "┗");
  95.         std::cout << viewstr<< " " << *iter << '\n';
  96.         iter++;
  97.     }
  98.     delete dirnext;
  99.     delete str1;
  100.     delete str2;
  101.     delete dirs;
  102.     delete files;
  103.     closedir(dir);
  104. }
  105.  
  106. int main(int argc, char *argv[])
  107. {
  108.     if (argc > 1) rec_dir(argv[1], "┣━━");
  109.     else
  110.     {
  111.         std::string path = argv[0];
  112.         int i = path.rfind("/");
  113.         rec_dir(path.substr(0, i).c_str(), "┣━━");
  114.     }
  115.     return(0);
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement