Fix saving files on Windows

turn a move into a copy and remove

Seems to work better with windows way of working with open files being
overwritten and stuff

BUGS: 458574
This commit is contained in:
Albert Astals Cid 2022-09-04 22:05:05 +02:00
parent 8cb15507fd
commit 8e93995e3c

View File

@ -2684,6 +2684,9 @@ bool Part::saveAs(const QUrl &saveUrl, SaveAsFlags flags)
bool setModifiedAfterSave = false;
QString tmpFileName;
// don't turn the file_copy that use this to a file_move
// doesn't work on Windows
bool deleteTmpFileName = false;
{
// Own scope for the QTemporaryFile since we only care about the random name
// we need to destroy it so the file gets deleted otherwise windows will complain
@ -2734,7 +2737,8 @@ bool Part::saveAs(const QUrl &saveUrl, SaveAsFlags flags)
return false;
}
copyJob = KIO::file_move(QUrl::fromLocalFile(tmpFileName), realSaveUrl, -1, KIO::Overwrite);
copyJob = KIO::file_copy(QUrl::fromLocalFile(tmpFileName), realSaveUrl, -1, KIO::Overwrite);
deleteTmpFileName = true;
} else {
bool wontSaveForms, wontSaveAnnotations;
checkNativeSaveDataLoss(&wontSaveForms, &wontSaveAnnotations);
@ -2806,7 +2810,8 @@ bool Part::saveAs(const QUrl &saveUrl, SaveAsFlags flags)
return false;
}
copyJob = KIO::file_move(QUrl::fromLocalFile(tmpFileName), realSaveUrl, -1, KIO::Overwrite);
copyJob = KIO::file_copy(QUrl::fromLocalFile(tmpFileName), realSaveUrl, -1, KIO::Overwrite);
deleteTmpFileName = true;
} else {
// If the generators doesn't support saving changes, we will
// just copy the original file.
@ -2822,7 +2827,8 @@ bool Part::saveAs(const QUrl &saveUrl, SaveAsFlags flags)
return false;
}
copyJob = KIO::file_move(QUrl::fromLocalFile(tmpFileName), realSaveUrl, -1, KIO::Overwrite);
copyJob = KIO::file_copy(QUrl::fromLocalFile(tmpFileName), realSaveUrl, -1, KIO::Overwrite);
deleteTmpFileName = true;
} else {
// Otherwise just copy the open file.
// make use of the already downloaded (in case of remote URLs) file,
@ -2864,6 +2870,13 @@ bool Part::saveAs(const QUrl &saveUrl, SaveAsFlags flags)
unsetFileToWatch();
}
const auto deleteTmpFileFunction = [deleteTmpFileName, tmpFileName] {
Q_ASSERT(deleteTmpFileName == QFile::exists(tmpFileName));
if (deleteTmpFileName) {
QFile::remove(tmpFileName);
}
};
KJobWidgets::setWindow(copyJob, widget());
if (!copyJob->exec()) {
KMessageBox::information(widget(), i18n("File could not be saved in '%1'. Error: '%2'. Try to save it to another location.", saveUrl.toDisplayString(), copyJob->errorString()));
@ -2873,8 +2886,11 @@ bool Part::saveAs(const QUrl &saveUrl, SaveAsFlags flags)
setFileToWatch(localFilePath());
}
deleteTmpFileFunction();
return false;
}
deleteTmpFileFunction();
m_document->setHistoryClean(true);