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 <vector>
- #include <algorithm>
- #include <string_view>
- using std::filesystem::path;
- path operator""_p(const char* data, std::size_t sz) {
- return path(data, data + sz);
- }
- void PrintTree(std::ostream& dst, const std::filesystem::path& p, const std::filesystem::file_status& status, int offset) {
- if (status.type() == std::filesystem::file_type::regular) {
- dst << std::string (offset, ' ')
- << std::string(p.filename()) << std::endl;
- } else if (status.type() == std::filesystem::file_type::directory) {
- dst << std::string(offset, ' ')
- << std::string(p.filename()) << std::endl;
- std::vector<std::filesystem::path> vector_path;
- for (const std::filesystem::path& dir_entry : std::filesystem::directory_iterator(p)) {
- vector_path.push_back(dir_entry);
- }
- std::sort(vector_path.begin(),
- vector_path.end(),
- [](std::filesystem::path lhs, std::filesystem::path rhs) {
- return std::lexicographical_compare(std::string(rhs.filename()).begin(),
- std::string(rhs.filename()).end(),
- std::string(lhs.filename()).begin(),
- std::string(lhs.filename()).end());
- });
- for (const std::filesystem::path& dir_entry : vector_path) {
- std::error_code err;
- auto new_status = std::filesystem::status(dir_entry, err);
- PrintTree(dst, dir_entry, new_status, offset + 2);
- }
- }
- }
- void PrintTree(std::ostream& dst, const path& p) {
- std::error_code err;
- auto status = std::filesystem::status(p,err);
- PrintTree(dst, p, status, 0);
- }
- int main() {
- using namespace std::literals;
- std::error_code err;
- std::filesystem::remove_all("test_dir", err);
- std::filesystem::create_directories("test_dir"_p / "a"_p, err);
- std::filesystem::create_directories("test_dir"_p / "b"_p, err);
- std::ofstream("test_dir"_p / "b"_p / "f1.txt"_p);
- std::ofstream("test_dir"_p / "b"_p / "f2.txt"_p);
- std::ofstream("test_dir"_p / "a"_p / "f3.txt"_p);
- std::ostringstream out;
- PrintTree(out, "test_dir"_p);
- 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