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 #include // for GetSaveFileName #include // getcwd +#include #include #include // guid stuff #include @@ -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 -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; }