From 8d609692b397f2fad522ec35a430f92bf691f44d Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 26 Sep 2018 09:49:02 +0200 Subject: Utils: Fix file saver for delete locked files If we can not delete a file via the ReplaceFile operation, because we ca not get the DELETE access right we still can try to replace it contents. Task-number: QTCREATORBUG-7668 Change-Id: I8804133a0e118518307f33976b821d5b2fdc9b8d Reviewed-by: Ivan Donchevskii --- src/libs/utils/savefile.cpp | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/libs/utils/savefile.cpp b/src/libs/utils/savefile.cpp index 13b9db0d84..7f26761419 100644 --- a/src/libs/utils/savefile.cpp +++ b/src/libs/utils/savefile.cpp @@ -128,19 +128,32 @@ bool SaveFile::commit() fileName().toStdWString().data(), nullptr, REPLACEFILE_IGNORE_MERGE_ERRORS, nullptr, nullptr); if (!result) { - const DWORD replaceErrorCode = GetLastError(); + DWORD replaceErrorCode = GetLastError(); QString errorStr; if (!QFile::exists(finalFileName)) { // Replace failed because finalFileName does not exist, try rename. if (!(result = rename(finalFileName))) errorStr = errorString(); } else { - wchar_t messageBuffer[256]; - FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - nullptr, replaceErrorCode, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - messageBuffer, sizeof(messageBuffer), nullptr); - errorStr = QString::fromWCharArray(messageBuffer); + if (replaceErrorCode == ERROR_UNABLE_TO_REMOVE_REPLACED) { + // If we do not get the rights to remove the original final file we still might try + // to replace the file contents + result = MoveFileEx(fileName().toStdWString().data(), + finalFileName.toStdWString().data(), + MOVEFILE_COPY_ALLOWED + | MOVEFILE_REPLACE_EXISTING + | MOVEFILE_WRITE_THROUGH); + if (!result) + replaceErrorCode = GetLastError(); + } + if (!result) { + wchar_t messageBuffer[256]; + FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + nullptr, replaceErrorCode, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + messageBuffer, sizeof(messageBuffer), nullptr); + errorStr = QString::fromWCharArray(messageBuffer); + } } if (!result) { remove(); -- cgit v1.2.3