Utils: fix savefile in case we save new file (Windows)

Previous fix accidently broke saving files that do not
exist yet. They need to call rename instead of ReplaceFile.

Change-Id: Ida47845a59c1f2fe26a39dc593ab0f83fae9d18b
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
This commit is contained in:
Ivan Donchevskii
2017-12-18 15:42:51 +01:00
parent 3006a13869
commit bc4efa662c

View File

@@ -124,19 +124,31 @@ bool SaveFile::commit()
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
// Release the file lock // Release the file lock
m_tempFile.reset(); m_tempFile.reset();
bool replaceResult = ReplaceFile(finalFileName.toStdWString().data(), bool result = ReplaceFile(finalFileName.toStdWString().data(),
fileName().toStdWString().data(), fileName().toStdWString().data(),
nullptr, 0, nullptr, nullptr); nullptr, 0, nullptr, nullptr);
if (!replaceResult) { if (!result) {
wchar_t messageBuffer[256]; const DWORD replaceErrorCode = GetLastError();
size_t size = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, QString errorStr;
nullptr, GetLastError(), if (!QFile::exists(finalFileName)) {
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Replace failed because finalFileName does not exist, try rename.
messageBuffer, sizeof(messageBuffer), nullptr); if (!(result = rename(finalFileName)))
setErrorString(QString::fromWCharArray(messageBuffer)); errorStr = errorString();
remove(); } 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 (!result) {
remove();
setErrorString(errorStr);
}
} }
return replaceResult;
return result;
#else #else
const QString backupName = finalFileName + '~'; const QString backupName = finalFileName + '~';