From d90c320dda8f1095cc99ec79ee2a084375948f8c Mon Sep 17 00:00:00 2001 From: Marco Rodolfi Date: Mon, 20 Jan 2025 14:45:32 +0100 Subject: [PATCH] [filesystem] Moved generic methods to platform independent code --- src/xenia/base/filesystem.cc | 24 ++++++++++++++++++++++++ src/xenia/base/filesystem_posix.cc | 24 +++++++++++++++--------- src/xenia/base/filesystem_win.cc | 24 ------------------------ 3 files changed, 39 insertions(+), 33 deletions(-) diff --git a/src/xenia/base/filesystem.cc b/src/xenia/base/filesystem.cc index d7b7b647d..d8c61935d 100644 --- a/src/xenia/base/filesystem.cc +++ b/src/xenia/base/filesystem.cc @@ -24,5 +24,29 @@ bool CreateParentFolder(const std::filesystem::path& path) { return true; } +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), + [](const FileInfo& file) { + return file.type == FileInfo::Type::kDirectory; + }); + + return std::move(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](const FileInfo& file) { + return std::regex_match(file.name.filename().string(), pattern); + }); + return std::move(filtered_entries); +} + } // namespace filesystem } // namespace xe diff --git a/src/xenia/base/filesystem_posix.cc b/src/xenia/base/filesystem_posix.cc index 73b06271c..46a8f3b37 100644 --- a/src/xenia/base/filesystem_posix.cc +++ b/src/xenia/base/filesystem_posix.cc @@ -192,20 +192,26 @@ std::unique_ptr FileHandle::OpenExisting( return std::make_unique(path, handle); } -bool GetInfo(const std::filesystem::path& path, FileInfo* out_info) { +std::optional GetInfo(const std::filesystem::path& path) { + FileInfo info{}; struct stat st; if (stat(path.c_str(), &st) == 0) { if (S_ISDIR(st.st_mode)) { - out_info->type = FileInfo::Type::kDirectory; + info.type = FileInfo::Type::kDirectory; + // On Linux st.st_size can have non-zero size (generally 4096) so make 0 + info.total_size = 0; } else { - out_info->type = FileInfo::Type::kFile; + info.type = FileInfo::Type::kFile; + info.total_size = st.st_size; } - out_info->create_timestamp = convertUnixtimeToWinFiletime(st.st_ctime); - out_info->access_timestamp = convertUnixtimeToWinFiletime(st.st_atime); - out_info->write_timestamp = convertUnixtimeToWinFiletime(st.st_mtime); - return true; + info.path = path.parent_path(); + info.name = path.filename(); + info.create_timestamp = convertUnixtimeToWinFiletime(st.st_ctime); + info.access_timestamp = convertUnixtimeToWinFiletime(st.st_atime); + info.write_timestamp = convertUnixtimeToWinFiletime(st.st_mtime); + return std::move(info); } - return false; + return {}; } std::vector ListFiles(const std::filesystem::path& path) { @@ -240,7 +246,7 @@ std::vector ListFiles(const std::filesystem::path& path) { result.push_back(info); } closedir(dir); - return result; + return std::move(result); } bool SetAttributes(const std::filesystem::path& path, uint64_t attributes) { diff --git a/src/xenia/base/filesystem_win.cc b/src/xenia/base/filesystem_win.cc index f2a8a9bd7..7a50d8b12 100644 --- a/src/xenia/base/filesystem_win.cc +++ b/src/xenia/base/filesystem_win.cc @@ -263,30 +263,6 @@ 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; -} - bool SetAttributes(const std::filesystem::path& path, uint64_t attributes) { return SetFileAttributes(path.c_str(), static_cast(attributes)); }