summaryrefslogtreecommitdiff
path: root/Source/Core/Common/FileUtil.cpp
diff options
context:
space:
mode:
authorShawn Hoffman <godisgovernment@gmail.com>2022-10-29 19:30:15 -0700
committerShawn Hoffman <godisgovernment@gmail.com>2022-10-29 19:57:26 -0700
commit836bc74b2dba878d3790d4144fadb7984436f84b (patch)
tree789b4fb29dcc098e37e16e27d0249d8d24045691 /Source/Core/Common/FileUtil.cpp
parent0628794cb6fb2ee4840131066f3d51667a875a34 (diff)
windows: Rename: use std::filesystem::rename for posix behavior
Diffstat (limited to 'Source/Core/Common/FileUtil.cpp')
-rw-r--r--Source/Core/Common/FileUtil.cpp61
1 files changed, 12 insertions, 49 deletions
diff --git a/Source/Core/Common/FileUtil.cpp b/Source/Core/Common/FileUtil.cpp
index cc1d2c7600..cbd92fc265 100644
--- a/Source/Core/Common/FileUtil.cpp
+++ b/Source/Core/Common/FileUtil.cpp
@@ -33,6 +33,7 @@
#include <Shlwapi.h>
#include <commdlg.h> // for GetSaveFileName
#include <direct.h> // getcwd
+#include <filesystem>
#include <io.h>
#include <objbase.h> // guid stuff
#include <shellapi.h>
@@ -322,65 +323,27 @@ bool DeleteDir(const std::string& filename, IfAbsentBehavior behavior)
return false;
}
-// Repeatedly invokes func until it returns true or max_attempts failures.
-// Waits after each failure, with each delay doubling in length.
-template <typename FuncType>
-static bool AttemptMaxTimesWithExponentialDelay(int max_attempts, std::chrono::milliseconds delay,
- std::string_view func_name, const FuncType& func)
-{
- for (int failed_attempts = 0; failed_attempts < max_attempts; ++failed_attempts)
- {
- if (func())
- {
- return true;
- }
- if (failed_attempts + 1 < max_attempts)
- {
- INFO_LOG_FMT(COMMON, "{} attempt failed, delaying for {} milliseconds", func_name,
- delay.count());
- std::this_thread::sleep_for(delay);
- delay *= 2;
- }
- }
- return false;
-}
-
// renames file srcFilename to destFilename, returns true on success
bool Rename(const std::string& srcFilename, const std::string& destFilename)
{
DEBUG_LOG_FMT(COMMON, "Rename: {} --> {}", srcFilename, destFilename);
#ifdef _WIN32
- const std::wstring source_wstring = UTF8ToTStr(srcFilename);
- const std::wstring destination_wstring = UTF8ToTStr(destFilename);
-
- // On Windows ReplaceFile can fail spuriously due to antivirus checking or other noise.
- // Retry the operation with increasing delays, and if none of them work there's probably a
- // persistent problem.
- const bool success = AttemptMaxTimesWithExponentialDelay(
- 3, std::chrono::milliseconds(5), fmt::format("Rename {} --> {}", srcFilename, destFilename),
- [&source_wstring, &destination_wstring] {
- if (ReplaceFile(destination_wstring.c_str(), source_wstring.c_str(), nullptr,
- REPLACEFILE_IGNORE_MERGE_ERRORS, nullptr, nullptr))
- {
- return true;
- }
- // Might have failed because the destination doesn't exist.
- if (GetLastError() == ERROR_FILE_NOT_FOUND)
- {
- return MoveFile(source_wstring.c_str(), destination_wstring.c_str()) != 0;
- }
- return false;
- });
- constexpr auto error_string_func = GetLastErrorString;
+ std::error_code error;
+ std::filesystem::rename(UTF8ToWString(srcFilename), UTF8ToWString(destFilename), error);
+ if (error)
+ {
+ ERROR_LOG_FMT(COMMON, "Rename failed: {} --> {}: {}", srcFilename, destFilename,
+ error.message());
+ }
+ const bool success = !error;
#else
const bool success = rename(srcFilename.c_str(), destFilename.c_str()) == 0;
- constexpr auto error_string_func = LastStrerrorString;
-#endif
if (!success)
{
- ERROR_LOG_FMT(COMMON, "Rename: rename failed on {} --> {}: {}", srcFilename, destFilename,
- error_string_func());
+ ERROR_LOG_FMT(COMMON, "Rename failed {} --> {}: {}", srcFilename, destFilename,
+ LastStrerrorString());
}
+#endif
return success;
}