diff --git a/src/xenia/base/filesystem.h b/src/xenia/base/filesystem.h index cca30dd3f..d72cf4f3c 100644 --- a/src/xenia/base/filesystem.h +++ b/src/xenia/base/filesystem.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -123,6 +124,9 @@ struct FileInfo { }; bool GetInfo(const std::filesystem::path& path, FileInfo* out_info); std::vector ListFiles(const std::filesystem::path& path); +std::vector ListDirectories(const std::filesystem::path& path); +std::vector FilterByName(const std::vector& files, + const std::regex pattern); #if XE_PLATFORM_ANDROID void AndroidInitialize(); diff --git a/src/xenia/base/filesystem_win.cc b/src/xenia/base/filesystem_win.cc index fb6edbb91..79a86d6b0 100644 --- a/src/xenia/base/filesystem_win.cc +++ b/src/xenia/base/filesystem_win.cc @@ -261,5 +261,29 @@ std::vector ListFiles(const std::filesystem::path& path) { return result; } +std::vector ListDirectories(const std::filesystem::path& path) { + std::vector files = ListFiles(path); + std::vector directories = {}; + + std::copy_if( + files.cbegin(), files.cend(), std::back_inserter(directories), + [](FileInfo file) { return file.type == FileInfo::Type::kDirectory; }); + + return directories; +} + +std::vector FilterByName(const std::vector& files, + const std::regex pattern) { + std::vector filtered_entries = {}; + + std::copy_if(files.cbegin(), files.cend(), + std::back_inserter(filtered_entries), [pattern](FileInfo file) { + return std::regex_match(file.name.filename().string(), + pattern); + }); + + return filtered_entries; +} + } // namespace filesystem } // namespace xe