From 19ff02de4bd317cf3134525e453aa8448de2d13a Mon Sep 17 00:00:00 2001 From: Rainer Kartmann <rainer.kartmann@kit.edu> Date: Fri, 30 Jun 2023 13:20:49 +0200 Subject: [PATCH] Add list_directory_recursive() --- SimoxUtility/filesystem/list_directory.cpp | 52 +++++++++++++++------- SimoxUtility/filesystem/list_directory.h | 9 +++- 2 files changed, 43 insertions(+), 18 deletions(-) diff --git a/SimoxUtility/filesystem/list_directory.cpp b/SimoxUtility/filesystem/list_directory.cpp index 00ab3514b..a1b80b0b4 100644 --- a/SimoxUtility/filesystem/list_directory.cpp +++ b/SimoxUtility/filesystem/list_directory.cpp @@ -2,31 +2,51 @@ #include <algorithm> - namespace simox { - std::vector<fs::path> fs::list_directory(const path& directory, bool local, bool sort) + + namespace impl { - std::vector<path> entries; - for (const auto& entry : directory_iterator(directory)) - { - entries.push_back(entry.path()); - } - if (sort) - { - std::sort(entries.begin(), entries.end()); - } - if (local) + template <class DirectoryIteratorT> + std::vector<fs::path> + list_directory(const fs::path& directory, bool local, bool sort) { - for (auto& entry : entries) + std::vector<fs::path> entries; + for (const auto& entry : DirectoryIteratorT(directory)) + { + entries.push_back(entry.path()); + } + + if (sort) { - entry = entry.filename(); + std::sort(entries.begin(), entries.end()); } + + if (local) + { + for (auto& entry : entries) + { + entry = entry.filename(); + } + } + return entries; } - return entries; + + } // namespace impl + + std::vector<fs::path> + fs::list_directory(const path& directory, bool local, bool sort) + { + return impl::list_directory<std::filesystem::directory_iterator>(directory, local, sort); } -} + std::vector<std::filesystem::__cxx11::path> + fs::list_directory_recursive(const path& directory, bool local, bool sort) + { + return impl::list_directory<std::filesystem::recursive_directory_iterator>( + directory, local, sort); + } +} // namespace simox diff --git a/SimoxUtility/filesystem/list_directory.h b/SimoxUtility/filesystem/list_directory.h index c0342d8c4..b5eeea79d 100644 --- a/SimoxUtility/filesystem/list_directory.h +++ b/SimoxUtility/filesystem/list_directory.h @@ -3,7 +3,6 @@ #include <filesystem> #include <vector> - namespace simox::fs { using namespace std::filesystem; @@ -18,5 +17,11 @@ namespace simox::fs * @return The entries in `directory`. */ std::vector<path> list_directory(const path& directory, bool local = false, bool sort = true); -} + /** + * @brief Same as list_directory(), but recurses into subdirectories. + */ + std::vector<path> + list_directory_recursive(const path& directory, bool local = false, bool sort = true); + +} // namespace simox::fs -- GitLab