Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <dirent.h>
- #include <string>
- #include <cstring>
- #include <list>
- #include <algorithm>
- int rec_dir(const char *dirfirst, std::string viewstr)
- {
- DIR *dir;
- struct dirent *entry;
- dir = opendir(dirfirst);
- if (!dir)
- {
- perror("diropen");
- exit(1);
- }
- std::list<std::string> *files = new std::list<std::string>;
- std::list<std::string> *dirs = new std::list<std::string>;
- std::list<std::string>::iterator iter;
- std::string *str1 = new std::string;
- std::string *str2 = new std::string;
- while ((entry = readdir(dir)) != NULL)
- {
- *str2 = entry->d_name;
- std::transform(str2->begin(), str2->end(), str2->begin(), [](unsigned char c){return std::tolower(c);});
- if (entry->d_type == DT_DIR)
- {
- iter = dirs->begin();
- do
- {
- if (dirs->empty())
- {
- dirs->push_back(entry->d_name);
- break;
- }
- if (entry->d_name < *iter)
- {
- dirs->insert(iter, entry->d_name);
- break;
- }
- iter++;
- if (iter == dirs->end()) dirs->push_back(entry->d_name);
- } while (iter != dirs->end());
- }
- else
- {
- iter = files->begin();
- do
- {
- if (files->empty())
- {
- files->push_back(entry->d_name);
- break;
- }
- *str1 = *iter;
- std::transform(str1->begin(), str1->end(), str1->begin(), [](unsigned char c){return std::tolower(c);});
- if (*str1 > *str2)
- {
- files->insert(iter, entry->d_name);
- break;
- }
- iter++;
- if (iter == files->end()) files->push_back(entry->d_name);
- } while (iter != files->end());
- }
- }
- std::list<std::string>::iterator iter1;
- iter = dirs->begin();
- iter++;
- iter++;
- std::string *dirnext = new std::string;
- while (iter != dirs->end())
- {
- iter1 = iter;
- if (++iter1 == dirs->end() && files->empty()) viewstr.replace(viewstr.length()-9, 3, "┗");
- std::cout << viewstr << " " << *iter << '\n';
- viewstr.replace(viewstr.length()-9, 3, "┣");
- *dirnext = dirfirst;
- *dirnext += "/";
- *dirnext += *iter;
- rec_dir(dirnext->c_str(), "┃ " + viewstr);
- iter++;
- }
- viewstr.replace(viewstr.length()-9, 3, "┣");
- iter = files->begin();
- while (iter != files->end())
- {
- iter1 = iter;
- if (++iter1 == files->end()) viewstr.replace(viewstr.length()-9, 3, "┗");
- std::cout << viewstr<< " " << *iter << '\n';
- iter++;
- }
- delete dirnext;
- delete str1;
- delete str2;
- delete dirs;
- delete files;
- closedir(dir);
- }
- int main(int argc, char *argv[])
- {
- if (argc > 1) rec_dir(argv[1], "┣━━");
- else
- {
- std::string path = argv[0];
- int i = path.rfind("/");
- rec_dir(path.substr(0, i).c_str(), "┣━━");
- }
- return(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement