diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp index 0d69d3835a0..c1f01267949 100644 --- a/src/corelib/io/qtemporaryfile.cpp +++ b/src/corelib/io/qtemporaryfile.cpp @@ -886,21 +886,27 @@ void QTemporaryFile::setFileTemplate(const QString &name) bool QTemporaryFile::rename(const QString &newName) { Q_D(QTemporaryFile); - auto tef = static_cast(d->fileEngine.get()); - if (!tef || !tef->isReallyOpen() || !tef->filePathWasTemplate) - return QFile::rename(newName); + return d->rename(newName, false); +} - unsetError(); - close(); - if (error() == QFile::NoError) { - if (tef->rename(newName)) { - unsetError(); +bool QTemporaryFilePrivate::rename(const QString &newName, bool overwrite) +{ + Q_Q(QTemporaryFile); + auto tef = static_cast(fileEngine.get()); + if (!tef || !tef->isReallyOpen() || !tef->filePathWasTemplate) + return q->QFile::rename(newName); + + q->unsetError(); + q->close(); + if (q->error() == QFile::NoError) { + if (overwrite ? tef->renameOverwrite(newName) : tef->rename(newName)) { + q->unsetError(); // engine was able to handle the new name so we just reset it - d->fileName = newName; + fileName = newName; return true; } - d->setError(QFile::RenameError, tef->errorString()); + setError(QFile::RenameError, tef->errorString()); } return false; } diff --git a/src/corelib/io/qtemporaryfile_p.h b/src/corelib/io/qtemporaryfile_p.h index d160afe41ed..d79ffc266b9 100644 --- a/src/corelib/io/qtemporaryfile_p.h +++ b/src/corelib/io/qtemporaryfile_p.h @@ -56,6 +56,8 @@ public: explicit QTemporaryFilePrivate(const QString &templateNameIn); ~QTemporaryFilePrivate(); + bool rename(const QString &newName, bool overwrite); + QAbstractFileEngine *engine() const override; void resetFileEngine() const; void materializeUnnamedFile();