From e479f9241829130d9a23b12eea2b1142b6e2f282 Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Wed, 22 Feb 2023 02:31:06 +0100 Subject: [PATCH] Common/FileUtil: Add CreateDirs() function as a wrapper around std::filesystem::create_directories(). --- Source/Core/Common/FileUtil.cpp | 17 ++++++++++++++++- Source/Core/Common/FileUtil.h | 5 ++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Source/Core/Common/FileUtil.cpp b/Source/Core/Common/FileUtil.cpp index e7e3e033aa..454277f55a 100644 --- a/Source/Core/Common/FileUtil.cpp +++ b/Source/Core/Common/FileUtil.cpp @@ -193,7 +193,6 @@ bool Delete(const std::string& filename, IfAbsentBehavior behavior) return true; } -// Returns true if successful, or path already exists. bool CreateDir(const std::string& path) { DEBUG_LOG_FMT(COMMON, "{}: directory {}", __func__, path); @@ -209,6 +208,22 @@ bool CreateDir(const std::string& path) return success; } +bool CreateDirs(std::string_view path) +{ + DEBUG_LOG_FMT(COMMON, "{}: directory {}", __func__, path); + + std::error_code error; + auto native_path = StringToPath(path); + bool success = fs::create_directories(native_path, error); + // If the path was not created, check if it was a pre-existing directory + std::error_code error_ignored; + if (!success && fs::is_directory(native_path, error_ignored)) + success = true; + if (!success) + ERROR_LOG_FMT(COMMON, "{}: failed on {}: {}", __func__, path, error.message()); + return success; +} + bool CreateFullPath(std::string_view fullPath) { DEBUG_LOG_FMT(COMMON, "{}: path {}", __func__, fullPath); diff --git a/Source/Core/Common/FileUtil.h b/Source/Core/Common/FileUtil.h index e6523498c0..f8cd92a880 100644 --- a/Source/Core/Common/FileUtil.h +++ b/Source/Core/Common/FileUtil.h @@ -140,9 +140,12 @@ u64 GetSize(const std::string& path); // Overloaded GetSize, accepts FILE* u64 GetSize(FILE* f); -// Returns true if successful, or path already exists. +// Creates a single directory. Returns true if successful or if the path already exists. bool CreateDir(const std::string& filename); +// Creates directories recursively. Returns true if successful or if the path already exists. +bool CreateDirs(std::string_view filename); + // Creates the full path to the file given in fullPath. // That is, for path '/a/b/c.bin', creates folders '/a' and '/a/b'. // Returns true if creation is successful or if the path already exists.