From 02a0d697cb88f63169aa27dad3f2412440f9d7b2 Mon Sep 17 00:00:00 2001 From: Gliniak <153369+Gliniak@users.noreply.github.com> Date: Sun, 24 May 2026 22:02:33 +0200 Subject: [PATCH] [Base] Added option to recursively search for file --- src/xenia/base/filesystem.cc | 36 ++++++++++++++++++++++++++++++++++-- src/xenia/base/filesystem.h | 3 +++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/xenia/base/filesystem.cc b/src/xenia/base/filesystem.cc index 93b3bb200..2d2096aff 100644 --- a/src/xenia/base/filesystem.cc +++ b/src/xenia/base/filesystem.cc @@ -9,6 +9,8 @@ #include "xenia/base/filesystem.h" +#include "xenia/base/string_util.h" + namespace xe { namespace filesystem { @@ -44,7 +46,7 @@ std::vector ListDirectories(const std::filesystem::path& path) { return file.type == FileInfo::Type::kDirectory; }); - return std::move(directories); + return directories; } std::vector FilterByName(const std::vector& files, @@ -56,7 +58,37 @@ std::vector FilterByName(const std::vector& files, [pattern](const FileInfo& file) { return std::regex_match(file.name.filename().string(), pattern); }); - return std::move(filtered_entries); + return filtered_entries; +} + +std::vector FindFileWithName(const std::filesystem::path& path, + std::string_view name, bool recursive) { + if (!std::filesystem::exists(path)) { + return {}; + } + + if (!std::filesystem::is_directory(path)) { + return {}; + } + + if (!recursive) { + return FilterByName(ListFiles(path), std::regex(std::string(name))); + } + + const std::string file_name = xe::utf8::lower_ascii(name); + + std::vector filtered_entries = {}; + for (const auto& entry : + std::filesystem::recursive_directory_iterator(path)) { + if (entry.is_regular_file() && xe::utf8::lower_ascii(xe::path_to_utf8( + entry.path().filename())) == file_name) { + auto file_info = GetInfo(entry.path()); + if (file_info) { + filtered_entries.push_back(std::move(file_info.value())); + } + } + } + return filtered_entries; } } // namespace filesystem diff --git a/src/xenia/base/filesystem.h b/src/xenia/base/filesystem.h index 5dc3de7e7..e3e206b3e 100644 --- a/src/xenia/base/filesystem.h +++ b/src/xenia/base/filesystem.h @@ -133,6 +133,9 @@ 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); +std::vector FindFileWithName(const std::filesystem::path& path, + std::string_view name, + bool recursive = false); bool SetAttributes(const std::filesystem::path& path, uint64_t attributes);