summaryrefslogtreecommitdiffstats
path: root/src/common
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2020-12-09 09:22:16 +0100
committerReinUsesLisp <reinuseslisp@airmail.cc>2020-12-09 09:42:03 +0100
commit532983437616e15539b448594a360c138995e282 (patch)
tree2537197bb02dfce45dbc55933cabfa06a1b5bc25 /src/common
parentcommon/file_util: Succeed on CreateDir when the directory exists (diff)
downloadyuzu-532983437616e15539b448594a360c138995e282.tar
yuzu-532983437616e15539b448594a360c138995e282.tar.gz
yuzu-532983437616e15539b448594a360c138995e282.tar.bz2
yuzu-532983437616e15539b448594a360c138995e282.tar.lz
yuzu-532983437616e15539b448594a360c138995e282.tar.xz
yuzu-532983437616e15539b448594a360c138995e282.tar.zst
yuzu-532983437616e15539b448594a360c138995e282.zip
Diffstat (limited to 'src/common')
-rw-r--r--src/common/file_util.cpp25
-rw-r--r--src/common/file_util.h10
2 files changed, 31 insertions, 4 deletions
diff --git a/src/common/file_util.cpp b/src/common/file_util.cpp
index c4d738bb6..7752c0421 100644
--- a/src/common/file_util.cpp
+++ b/src/common/file_util.cpp
@@ -114,20 +114,41 @@ bool CreateDir(const fs::path& path) {
return true;
}
-bool CreateFullPath(const fs::path& path) {
+bool CreateDirs(const fs::path& path) {
LOG_TRACE(Common_Filesystem, "path {}", path.string());
+ if (Exists(path)) {
+ LOG_DEBUG(Common_Filesystem, "path exists {}", path.string());
+ return true;
+ }
+
std::error_code ec;
const bool success = fs::create_directories(path, ec);
if (!success) {
- LOG_ERROR(Common_Filesystem, "Unable to create full path: {}", ec.message());
+ LOG_ERROR(Common_Filesystem, "Unable to create directories: {}", ec.message());
return false;
}
return true;
}
+bool CreateFullPath(const fs::path& path) {
+ LOG_TRACE(Common_Filesystem, "path {}", path);
+
+ // Removes trailing slashes and turns any '\' into '/'
+ const auto new_path = SanitizePath(path.string(), DirectorySeparator::ForwardSlash);
+
+ if (new_path.rfind('.') == std::string::npos) {
+ // The path is a directory
+ return CreateDirs(new_path);
+ } else {
+ // The path is a file
+ // Creates directory preceding the last '/'
+ return CreateDirs(new_path.substr(0, new_path.rfind('/')));
+ }
+}
+
bool Rename(const fs::path& src, const fs::path& dst) {
LOG_TRACE(Common_Filesystem, "{} --> {}", src.string(), dst.string());
diff --git a/src/common/file_util.h b/src/common/file_util.h
index c2ee7ca27..cf006cc9d 100644
--- a/src/common/file_util.h
+++ b/src/common/file_util.h
@@ -54,8 +54,14 @@ enum class UserPath {
// Returns true if successful, or path already exists.
bool CreateDir(const std::filesystem::path& path);
-// Creates the full path of path. Returns true on success
-bool CreateFullPath(const std::filesystem::path& path);
+// Create all directories in path
+// Returns true if successful, or path already exists.
+[[nodiscard("Directory creation can fail and must be tested")]] bool CreateDirs(
+ const std::filesystem::path& path);
+
+// Creates directories in path. Returns true on success.
+[[deprecated("This function is deprecated, use CreateDirs")]] bool CreateFullPath(
+ const std::filesystem::path& path);
// Deletes a given file at the path.
// This will also delete empty directories.