summaryrefslogtreecommitdiffstats
path: root/src/common/fs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/common/fs/file.cpp10
-rw-r--r--src/common/fs/file.h3
-rw-r--r--src/common/fs/fs.cpp18
-rw-r--r--src/common/fs/path_util.h2
4 files changed, 23 insertions, 10 deletions
diff --git a/src/common/fs/file.cpp b/src/common/fs/file.cpp
index 9f3de1cb0..710e88b39 100644
--- a/src/common/fs/file.cpp
+++ b/src/common/fs/file.cpp
@@ -183,10 +183,6 @@ size_t WriteStringToFile(const std::filesystem::path& path, FileType type,
size_t AppendStringToFile(const std::filesystem::path& path, FileType type,
std::string_view string) {
- if (!Exists(path)) {
- return WriteStringToFile(path, type, string);
- }
-
if (!IsFile(path)) {
return 0;
}
@@ -309,7 +305,11 @@ bool IOFile::Flush() const {
errno = 0;
- const auto flush_result = std::fflush(file) == 0;
+#ifdef _WIN32
+ const auto flush_result = std::fflush(file) == 0 && _commit(fileno(file)) == 0;
+#else
+ const auto flush_result = std::fflush(file) == 0 && fsync(fileno(file)) == 0;
+#endif
if (!flush_result) {
const auto ec = std::error_code{errno, std::generic_category()};
diff --git a/src/common/fs/file.h b/src/common/fs/file.h
index 50e270c5b..0f10b6003 100644
--- a/src/common/fs/file.h
+++ b/src/common/fs/file.h
@@ -71,7 +71,7 @@ template <typename Path>
/**
* Writes a string to a file at path and returns the number of characters successfully written.
- * If an file already exists at path, its contents will be erased.
+ * If a file already exists at path, its contents will be erased.
* If the filesystem object at path is not a file, this function returns 0.
*
* @param path Filesystem path
@@ -95,7 +95,6 @@ template <typename Path>
/**
* Appends a string to a file at path and returns the number of characters successfully written.
- * If a file does not exist at path, WriteStringToFile is called instead.
* If the filesystem object at path is not a file, this function returns 0.
*
* @param path Filesystem path
diff --git a/src/common/fs/fs.cpp b/src/common/fs/fs.cpp
index d492480d9..d3159e908 100644
--- a/src/common/fs/fs.cpp
+++ b/src/common/fs/fs.cpp
@@ -321,7 +321,8 @@ bool RemoveDirContentsRecursively(const fs::path& path) {
std::error_code ec;
- for (const auto& entry : fs::recursive_directory_iterator(path, ec)) {
+ // TODO (Morph): Replace this with recursive_directory_iterator once it's fixed in MSVC.
+ for (const auto& entry : fs::directory_iterator(path, ec)) {
if (ec) {
LOG_ERROR(Common_Filesystem,
"Failed to completely enumerate the directory at path={}, ec_message={}",
@@ -337,6 +338,12 @@ bool RemoveDirContentsRecursively(const fs::path& path) {
PathToUTF8String(entry.path()), ec.message());
break;
}
+
+ // TODO (Morph): Remove this when MSVC fixes recursive_directory_iterator.
+ // recursive_directory_iterator throws an exception despite passing in a std::error_code.
+ if (entry.status().type() == fs::file_type::directory) {
+ return RemoveDirContentsRecursively(entry.path());
+ }
}
if (ec) {
@@ -475,7 +482,8 @@ void IterateDirEntriesRecursively(const std::filesystem::path& path,
std::error_code ec;
- for (const auto& entry : fs::recursive_directory_iterator(path, ec)) {
+ // TODO (Morph): Replace this with recursive_directory_iterator once it's fixed in MSVC.
+ for (const auto& entry : fs::directory_iterator(path, ec)) {
if (ec) {
break;
}
@@ -495,6 +503,12 @@ void IterateDirEntriesRecursively(const std::filesystem::path& path,
break;
}
}
+
+ // TODO (Morph): Remove this when MSVC fixes recursive_directory_iterator.
+ // recursive_directory_iterator throws an exception despite passing in a std::error_code.
+ if (entry.status().type() == fs::file_type::directory) {
+ IterateDirEntriesRecursively(entry.path(), callback, filter);
+ }
}
if (callback_error || ec) {
diff --git a/src/common/fs/path_util.h b/src/common/fs/path_util.h
index 14e8c35d7..f956ac9a2 100644
--- a/src/common/fs/path_util.h
+++ b/src/common/fs/path_util.h
@@ -209,7 +209,7 @@ void SetYuzuPath(YuzuPath yuzu_path, const std::filesystem::path& new_path);
#ifdef _WIN32
template <typename Path>
-[[nodiscard]] void SetYuzuPath(YuzuPath yuzu_path, const Path& new_path) {
+void SetYuzuPath(YuzuPath yuzu_path, const Path& new_path) {
if constexpr (IsChar<typename Path::value_type>) {
SetYuzuPath(yuzu_path, ToU8String(new_path));
} else {