diff --git a/SimoxUtility/filesystem/list_directory.cpp b/SimoxUtility/filesystem/list_directory.cpp index 00ab3514bfe6a3eb355769f0b4cf5dcef4f2a697..a1b80b0b4fad872b4d06fd039a9715a3ee199cb5 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 c0342d8c42e04c2bacbbf698f896f4d2b99a4ef4..b5eeea79ddb3929df705ffaaa5ad1ca8268761ff 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