file_util: Migrate Exists() and IsDirectory() over to std::filesystem
Greatly simplifies our file-handling code for these functions.
This commit is contained in:
		| @@ -3,6 +3,7 @@ | ||||
| // Refer to the license.txt file included. | ||||
|  | ||||
| #include <array> | ||||
| #include <filesystem> | ||||
| #include <limits> | ||||
| #include <memory> | ||||
| #include <sstream> | ||||
| @@ -75,62 +76,16 @@ | ||||
| // The code still needs a ton of cleanup. | ||||
| // REMEMBER: strdup considered harmful! | ||||
| namespace Common::FS { | ||||
| namespace fs = std::filesystem; | ||||
|  | ||||
| // Remove any ending forward slashes from directory paths | ||||
| // Modifies argument. | ||||
| static void StripTailDirSlashes(std::string& fname) { | ||||
|     if (fname.length() <= 1) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     std::size_t i = fname.length(); | ||||
|     while (i > 0 && fname[i - 1] == DIR_SEP_CHR) { | ||||
|         --i; | ||||
|     } | ||||
|     fname.resize(i); | ||||
| bool Exists(const fs::path& path) { | ||||
|     std::error_code ec; | ||||
|     return fs::exists(path, ec); | ||||
| } | ||||
|  | ||||
| bool Exists(const std::string& filename) { | ||||
|     struct stat file_info; | ||||
|  | ||||
|     std::string copy(filename); | ||||
|     StripTailDirSlashes(copy); | ||||
|  | ||||
| #ifdef _WIN32 | ||||
|     // Windows needs a slash to identify a driver root | ||||
|     if (copy.size() != 0 && copy.back() == ':') | ||||
|         copy += DIR_SEP_CHR; | ||||
|  | ||||
|     int result = _wstat64(Common::UTF8ToUTF16W(copy).c_str(), &file_info); | ||||
| #else | ||||
|     int result = stat(copy.c_str(), &file_info); | ||||
| #endif | ||||
|  | ||||
|     return (result == 0); | ||||
| } | ||||
|  | ||||
| bool IsDirectory(const std::string& filename) { | ||||
|     struct stat file_info; | ||||
|  | ||||
|     std::string copy(filename); | ||||
|     StripTailDirSlashes(copy); | ||||
|  | ||||
| #ifdef _WIN32 | ||||
|     // Windows needs a slash to identify a driver root | ||||
|     if (copy.size() != 0 && copy.back() == ':') | ||||
|         copy += DIR_SEP_CHR; | ||||
|  | ||||
|     int result = _wstat64(Common::UTF8ToUTF16W(copy).c_str(), &file_info); | ||||
| #else | ||||
|     int result = stat(copy.c_str(), &file_info); | ||||
| #endif | ||||
|  | ||||
|     if (result < 0) { | ||||
|         LOG_DEBUG(Common_Filesystem, "stat failed on {}: {}", filename, GetLastErrorMsg()); | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     return S_ISDIR(file_info.st_mode); | ||||
| bool IsDirectory(const fs::path& path) { | ||||
|     std::error_code ec; | ||||
|     return fs::is_directory(path, ec); | ||||
| } | ||||
|  | ||||
| bool Delete(const std::string& filename) { | ||||
|   | ||||
| @@ -6,6 +6,7 @@ | ||||
|  | ||||
| #include <array> | ||||
| #include <cstdio> | ||||
| #include <filesystem> | ||||
| #include <fstream> | ||||
| #include <functional> | ||||
| #include <limits> | ||||
| @@ -47,11 +48,11 @@ struct FSTEntry { | ||||
|     std::vector<FSTEntry> children; | ||||
| }; | ||||
|  | ||||
| // Returns true if file filename exists | ||||
| [[nodiscard]] bool Exists(const std::string& filename); | ||||
| // Returns true if the exists | ||||
| [[nodiscard]] bool Exists(const std::filesystem::path& path); | ||||
|  | ||||
| // Returns true if filename is a directory | ||||
| [[nodiscard]] bool IsDirectory(const std::string& filename); | ||||
| // Returns true if path is a directory | ||||
| [[nodiscard]] bool IsDirectory(const std::filesystem::path& path); | ||||
|  | ||||
| // Returns the size of filename (64bit) | ||||
| [[nodiscard]] u64 GetSize(const std::string& filename); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user