diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp index cb8b5dbefc..56b3d17dc1 100644 --- a/src/corelib/io/qtemporaryfile.cpp +++ b/src/corelib/io/qtemporaryfile.cpp @@ -223,7 +223,8 @@ class QTemporaryFileEngine : public QFSFileEngine Q_DECLARE_PRIVATE(QFSFileEngine) public: QTemporaryFileEngine(const QString &file, bool fileIsTemplate = true) - : QFSFileEngine(), filePathIsTemplate(fileIsTemplate) + : QFSFileEngine(), filePathIsTemplate(fileIsTemplate), + filePathWasTemplate(fileIsTemplate) { Q_D(QFSFileEngine); d->fileEntry = QFileSystemEntry(file); @@ -244,6 +245,7 @@ public: bool close(); bool filePathIsTemplate; + bool filePathWasTemplate; }; QTemporaryFileEngine::~QTemporaryFileEngine() @@ -379,6 +381,12 @@ bool QTemporaryFileEngine::remove() QFSFileEngine::close(); if (QFSFileEngine::remove()) { d->fileEntry.clear(); + // If a QTemporaryFile is constructed using a template file path, the path + // is generated in QTemporaryFileEngine::open() and then filePathIsTemplate + // is set to false. If remove() and then open() are called on the same + // QTemporaryFile, the path is not regenerated. Here we ensure that if the + // file path was generated, it will be generated again in the scenario above. + filePathIsTemplate = filePathWasTemplate; return true; } return false; diff --git a/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp b/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp index cda29fdf0b..b70abba0ce 100644 --- a/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp +++ b/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp @@ -76,6 +76,7 @@ private slots: void nonWritableCurrentDir(); void write(); void openCloseOpenClose(); + void removeAndReOpen(); void size(); void resize(); void openOnRootDrives(); @@ -316,6 +317,25 @@ void tst_QTemporaryFile::openCloseOpenClose() QVERIFY(!QFile::exists(fileName)); } +void tst_QTemporaryFile::removeAndReOpen() +{ + QString fileName; + { + QTemporaryFile file; + file.open(); + fileName = file.fileName(); + QVERIFY(QFile::exists(fileName)); + + file.remove(); + QVERIFY(!QFile::exists(fileName)); + + QVERIFY(file.open()); + fileName = file.fileName(); + QVERIFY(QFile::exists(fileName)); + } + QVERIFY(!QFile::exists(fileName)); +} + void tst_QTemporaryFile::size() { QTemporaryFile file;