From 0e54aa17e64a5c5b62d60a70414742be29eccff9 Mon Sep 17 00:00:00 2001
From: Lioncash <mathew1800@gmail.com>
Date: Tue, 8 Dec 2020 18:36:49 -0500
Subject: file_util: Migrate Exists() and IsDirectory() over to std::filesystem

Greatly simplifies our file-handling code for these functions.
---
 src/common/file_util.cpp | 61 +++++++-----------------------------------------
 1 file changed, 8 insertions(+), 53 deletions(-)

(limited to 'src/common/file_util.cpp')

diff --git a/src/common/file_util.cpp b/src/common/file_util.cpp
index 18fbfa25bf..67fcef3e41 100644
--- a/src/common/file_util.cpp
+++ b/src/common/file_util.cpp
@@ -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) {
-- 
cgit v1.2.3-70-g09d2