diff options
20 files changed, 72 insertions, 82 deletions
diff --git a/qmake/generators/win32/msvc_nmake.cpp b/qmake/generators/win32/msvc_nmake.cpp index cf58ead2e9..50666215c6 100644 --- a/qmake/generators/win32/msvc_nmake.cpp +++ b/qmake/generators/win32/msvc_nmake.cpp @@ -338,8 +338,7 @@ void NmakeMakefileGenerator::writeImplicitRulesPart(QTextStream &t) for (const QString &sourceDir : qAsConst(fixifiedSourceDirs)) { QDirIterator dit(sourceDir, sourceFilesFilter, QDir::Files | QDir::NoDotAndDotDot); while (dit.hasNext()) { - dit.next(); - const QFileInfo fi = dit.fileInfo(); + const QFileInfo fi = dit.nextFileInfo(); QString &duplicate = fileNames[fi.completeBaseName()]; if (duplicate.isNull()) { duplicate = fi.filePath(); diff --git a/qmake/main.cpp b/qmake/main.cpp index d435ecaed8..e99b33bd21 100644 --- a/qmake/main.cpp +++ b/qmake/main.cpp @@ -341,8 +341,7 @@ static int installFileOrDirectory(const QString &source, const QString &target, QDirIterator it(source, QDir::AllEntries | QDir::NoDotAndDotDot | QDir::Hidden); while (it.hasNext()) { - it.next(); - const QFileInfo &entry = it.fileInfo(); + const QFileInfo entry = it.nextFileInfo(); const QString &entryTarget = target + QDir::separator() + entry.fileName(); const int recursionResult = installFileOrDirectory(entry.filePath(), entryTarget, true); diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp index e92d2f9ca7..76336ef384 100644 --- a/src/corelib/io/qdir.cpp +++ b/src/corelib/io/qdir.cpp @@ -355,10 +355,8 @@ inline void QDirPrivate::initFileLists(const QDir &dir) const if (!fileListsInitialized) { QFileInfoList l; QDirIterator it(dir); - while (it.hasNext()) { - it.next(); - l.append(it.fileInfo()); - } + while (it.hasNext()) + l.append(it.nextFileInfo()); sortFileList(sort, l, &files, &fileInfos); fileListsInitialized = true; } @@ -1397,10 +1395,8 @@ QStringList QDir::entryList(const QStringList &nameFilters, Filters filters, QFileInfoList l; QDirIterator it(d->dirEntry.filePath(), nameFilters, filters); - while (it.hasNext()) { - it.next(); - l.append(it.fileInfo()); - } + while (it.hasNext()) + l.append(it.nextFileInfo()); QStringList ret; d->sortFileList(sort, l, &ret, nullptr); return ret; @@ -1439,10 +1435,8 @@ QFileInfoList QDir::entryInfoList(const QStringList &nameFilters, Filters filter QFileInfoList l; QDirIterator it(d->dirEntry.filePath(), nameFilters, filters); - while (it.hasNext()) { - it.next(); - l.append(it.fileInfo()); - } + while (it.hasNext()) + l.append(it.nextFileInfo()); QFileInfoList ret; d->sortFileList(sort, l, nullptr, &ret); return ret; @@ -1580,8 +1574,7 @@ bool QDir::removeRecursively() // not empty -- we must empty it first QDirIterator di(dirPath, QDir::AllEntries | QDir::Hidden | QDir::System | QDir::NoDotAndDotDot); while (di.hasNext()) { - di.next(); - const QFileInfo& fi = di.fileInfo(); + const QFileInfo fi = di.nextFileInfo(); const QString &filePath = di.filePath(); bool ok; if (fi.isDir() && !fi.isSymLink()) { diff --git a/src/corelib/io/qdiriterator.cpp b/src/corelib/io/qdiriterator.cpp index 792f2a863d..7e86aacdb1 100644 --- a/src/corelib/io/qdiriterator.cpp +++ b/src/corelib/io/qdiriterator.cpp @@ -60,11 +60,11 @@ \snippet code/src_corelib_io_qdiriterator.cpp 1 - The next() function returns the path to the next directory entry and - advances the iterator. You can also call filePath() to get the current - file path without advancing the iterator. The fileName() function returns - only the name of the file, similar to how QDir::entryList() works. You can - also call fileInfo() to get a QFileInfo for the current entry. + The next() and nextFileInfo() functions advance the iterator and return + the path or the QFileInfo of the next directory entry. You can also call + filePath() or fileInfo() to get the current file path or QFileInfo without + first advancing the iterator. The fileName() function returns only the + name of the file, similar to how QDir::entryList() works. Unlike Qt's container iterators, QDirIterator is uni-directional (i.e., you cannot iterate directories in reverse order) and does not allow random @@ -490,10 +490,12 @@ QDirIterator::~QDirIterator() new entry. If hasNext() returns \c false, this function does nothing, and returns an empty QString. - You can call fileName() or filePath() to get the current entry file name + You can call fileName() or filePath() to get the current entry's file name or path, or fileInfo() to get a QFileInfo for the current entry. - \sa hasNext(), fileName(), filePath(), fileInfo() + Call nextFileInfo() instead of next() if you're interested in the QFileInfo. + + \sa hasNext(), nextFileInfo(), fileName(), filePath(), fileInfo() */ QString QDirIterator::next() { @@ -502,10 +504,30 @@ QString QDirIterator::next() } /*! + \since 6.3 + + Advances the iterator to the next entry, and returns the file info of this + new entry. If hasNext() returns \c false, this function does nothing, and + returns an empty QFileInfo. + + You can call fileName() or filePath() to get the current entry's file name + or path, or fileInfo() to get a QFileInfo for the current entry. + + Call next() instead of nextFileInfo() when all you need is the filePath(). + + \sa hasNext(), fileName(), filePath(), fileInfo() +*/ +QFileInfo QDirIterator::nextFileInfo() +{ + d->advance(); + return fileInfo(); +} + +/*! Returns \c true if there is at least one more entry in the directory; otherwise, false is returned. - \sa next(), fileName(), filePath(), fileInfo() + \sa next(), nextFileInfo(), fileName(), filePath(), fileInfo() */ bool QDirIterator::hasNext() const { diff --git a/src/corelib/io/qdiriterator.h b/src/corelib/io/qdiriterator.h index acfe040a26..f3a4b979ac 100644 --- a/src/corelib/io/qdiriterator.h +++ b/src/corelib/io/qdiriterator.h @@ -69,6 +69,7 @@ public: ~QDirIterator(); QString next(); + QFileInfo nextFileInfo(); bool hasNext() const; QString fileName() const; diff --git a/src/corelib/io/qfileinfo.cpp b/src/corelib/io/qfileinfo.cpp index 8d471c3e1c..8f2eecc22a 100644 --- a/src/corelib/io/qfileinfo.cpp +++ b/src/corelib/io/qfileinfo.cpp @@ -1694,10 +1694,8 @@ QDebug operator<<(QDebug dbg, const QFileInfo &fi) QDirIterator it(dir); while (it.hasNext()) { - it.next(); - // Extract the QFileInfo from the iterator directly: - QFileInfo fi = it.fileInfo(); + QFileInfo fi = it.nextFileInfo(); ~~~ } diff --git a/src/corelib/io/qstorageinfo_unix.cpp b/src/corelib/io/qstorageinfo_unix.cpp index bdb798e89a..6845a24838 100644 --- a/src/corelib/io/qstorageinfo_unix.cpp +++ b/src/corelib/io/qstorageinfo_unix.cpp @@ -793,8 +793,7 @@ static inline QString retrieveLabel(const QByteArray &device) QDirIterator it(QLatin1String(pathDiskByLabel), QDir::NoDotAndDotDot); while (it.hasNext()) { - it.next(); - QFileInfo fileInfo(it.fileInfo()); + QFileInfo fileInfo = it.nextFileInfo(); if (fileInfo.isSymLink() && fileInfo.symLinkTarget() == devicePath) return decodeFsEncString(fileInfo.fileName()); } diff --git a/src/gui/itemmodels/qfileinfogatherer.cpp b/src/gui/itemmodels/qfileinfogatherer.cpp index bd368e945c..ec4ae2269b 100644 --- a/src/gui/itemmodels/qfileinfogatherer.cpp +++ b/src/gui/itemmodels/qfileinfogatherer.cpp @@ -401,8 +401,7 @@ void QFileInfoGatherer::getFileInfos(const QString &path, const QStringList &fil if (files.isEmpty()) { QDirIterator dirIt(path, QDir::AllEntries | QDir::System | QDir::Hidden); while (!abort.loadRelaxed() && dirIt.hasNext()) { - dirIt.next(); - fileInfo = dirIt.fileInfo(); + fileInfo = dirIt.nextFileInfo(); fileInfo.stat(); allFiles.append(fileInfo.fileName()); fetch(fileInfo, base, firstTime, updatedFiles, path); diff --git a/src/network/access/qnetworkdiskcache.cpp b/src/network/access/qnetworkdiskcache.cpp index 7b17540417..c6c20b742c 100644 --- a/src/network/access/qnetworkdiskcache.cpp +++ b/src/network/access/qnetworkdiskcache.cpp @@ -522,8 +522,8 @@ qint64 QNetworkDiskCache::expire() QMultiMap<QDateTime, QString> cacheItems; qint64 totalSize = 0; while (it.hasNext()) { - QString path = it.next(); - QFileInfo info = it.fileInfo(); + QFileInfo info = it.nextFileInfo(); + QString path = info.filePath(); QString fileName = info.fileName(); if (fileName.endsWith(CACHE_POSTFIX)) { const QDateTime birthTime = info.fileTime(QFile::FileBirthTime); diff --git a/src/plugins/tls/openssl/qtlsbackend_openssl.cpp b/src/plugins/tls/openssl/qtlsbackend_openssl.cpp index 2374f79ed6..5d3b3ea582 100644 --- a/src/plugins/tls/openssl/qtlsbackend_openssl.cpp +++ b/src/plugins/tls/openssl/qtlsbackend_openssl.cpp @@ -413,9 +413,8 @@ QList<QSslCertificate> systemCaCertificates() currentDir.setPath(QLatin1String(directory)); QDirIterator it(currentDir); while (it.hasNext()) { - it.next(); // use canonical path here to not load the same certificate twice if symlinked - certFiles.insert(it.fileInfo().canonicalFilePath()); + certFiles.insert(it.nextFileInfo().canonicalFilePath()); } } for (const QString& file : qAsConst(certFiles)) diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp index 8d43815cc8..631ca9afb6 100644 --- a/src/testlib/qtestcase.cpp +++ b/src/testlib/qtestcase.cpp @@ -2158,9 +2158,7 @@ QSharedPointer<QTemporaryDir> QTest::qExtractTestData(const QString &dirName) } while (it.hasNext()) { - it.next(); - - QFileInfo fileInfo = it.fileInfo(); + QFileInfo fileInfo = it.nextFileInfo(); if (!fileInfo.isDir()) { const QString destination = dataPath + QLatin1Char('/') + QStringView{fileInfo.filePath()}.mid(resourcePath.length()); diff --git a/src/tools/androiddeployqt/main.cpp b/src/tools/androiddeployqt/main.cpp index 0bd9f4e16e..25e5ea3d44 100644 --- a/src/tools/androiddeployqt/main.cpp +++ b/src/tools/androiddeployqt/main.cpp @@ -1080,8 +1080,7 @@ bool readInputFile(Options *options) if (QFileInfo(path).isDir()) { QDirIterator iterator(path, QDirIterator::Subdirectories); while (iterator.hasNext()) { - iterator.next(); - if (iterator.fileInfo().isFile()) { + if (iterator.nextFileInfo().isFile()) { QString subPath = iterator.filePath(); auto arch = fileArchitecture(*options, subPath); if (!arch.isEmpty()) { diff --git a/tests/auto/corelib/io/qdir/tst_qdir.cpp b/tests/auto/corelib/io/qdir/tst_qdir.cpp index a132750113..7b7a996cdd 100644 --- a/tests/auto/corelib/io/qdir/tst_qdir.cpp +++ b/tests/auto/corelib/io/qdir/tst_qdir.cpp @@ -242,9 +242,7 @@ tst_QDir::tst_QDir() QString resourceSourcePath = QStringLiteral(":/android_testdata/"); QDirIterator it(resourceSourcePath, QDirIterator::Subdirectories); while (it.hasNext()) { - it.next(); - - QFileInfo fileInfo = it.fileInfo(); + QFileInfo fileInfo = it.nextFileInfo(); if (!fileInfo.isDir()) { QString destination = m_dataPath + QLatin1Char('/') + fileInfo.filePath().mid(resourceSourcePath.length()); diff --git a/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp b/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp index b41352185d..35282ccaa3 100644 --- a/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp +++ b/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp @@ -127,9 +127,7 @@ void tst_QDirIterator::initTestCase() QString resourceSourcePath = QStringLiteral(":/testdata"); QDirIterator it(resourceSourcePath, QDirIterator::Subdirectories); while (it.hasNext()) { - it.next(); - - QFileInfo fileInfo = it.fileInfo(); + QFileInfo fileInfo = it.nextFileInfo(); if (!fileInfo.isDir()) { QString destination = testdata_dir + QLatin1Char('/') + fileInfo.filePath().mid(resourceSourcePath.length()); @@ -467,7 +465,7 @@ void tst_QDirIterator::stopLinkLoop() QStringList list; int max = 200; while (--max && it.hasNext()) - it.next(); + it.nextFileInfo(); QVERIFY(max); // The goal of this test is only to ensure that the test above don't malfunction @@ -508,10 +506,8 @@ void tst_QDirIterator::engineWithNoIterator() void tst_QDirIterator::absoluteFilePathsFromRelativeIteratorPath() { QDirIterator it("entrylist/", QDir::NoDotAndDotDot); - while (it.hasNext()) { - it.next(); - QVERIFY(QFileInfo(it.filePath()).absoluteFilePath().contains("entrylist")); - } + while (it.hasNext()) + QVERIFY(it.nextFileInfo().absoluteFilePath().contains("entrylist")); } void tst_QDirIterator::recurseWithFilters() const @@ -528,11 +524,9 @@ void tst_QDirIterator::recurseWithFilters() const expectedEntries.insert(QString::fromLatin1("recursiveDirs/textFileA.txt")); QVERIFY(it.hasNext()); - it.next(); - actualEntries.insert(it.fileInfo().filePath()); + actualEntries.insert(it.next()); QVERIFY(it.hasNext()); - it.next(); - actualEntries.insert(it.fileInfo().filePath()); + actualEntries.insert(it.next()); QCOMPARE(actualEntries, expectedEntries); QVERIFY(!it.hasNext()); @@ -555,7 +549,7 @@ void tst_QDirIterator::longPath() int m = 0; while (it.hasNext()) { ++m; - it.next(); + it.nextFileInfo(); } QCOMPARE(n, m); @@ -622,8 +616,7 @@ void tst_QDirIterator::hiddenDirs_hiddenFiles() QDirIterator di("hiddenDirs_hiddenFiles", QDir::Files | QDir::Hidden | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); while (di.hasNext()) { ++matches; - QString filename = di.next(); - if (QFileInfo(filename).isDir()) + if (di.nextFileInfo().isDir()) ++failures; // search was only supposed to find files } QCOMPARE(matches, 6); @@ -636,8 +629,7 @@ void tst_QDirIterator::hiddenDirs_hiddenFiles() QDirIterator di("hiddenDirs_hiddenFiles", QDir::Dirs | QDir::Hidden | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); while (di.hasNext()) { ++matches; - QString filename = di.next(); - if (!QFileInfo(filename).isDir()) + if (!di.nextFileInfo().isDir()) ++failures; // search was only supposed to find files } QCOMPARE(matches, 6); diff --git a/tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp b/tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp index b2f7aedab0..317a57a44c 100644 --- a/tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp +++ b/tests/auto/corelib/io/qresourceengine/tst_qresourceengine.cpp @@ -77,9 +77,7 @@ void tst_QResourceEngine::initTestCase() QDirIterator it(sourcePath, QDirIterator::Subdirectories); while (it.hasNext()) { - it.next(); - - QFileInfo fileInfo = it.fileInfo(); + QFileInfo fileInfo = it.nextFileInfo(); if (!fileInfo.isDir()) { QString destination(dataPath + QLatin1Char('/') + fileInfo.filePath().mid(sourcePath.length())); QFileInfo destinationFileInfo(destination); diff --git a/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp b/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp index 5c7d69a788..dcf3486449 100644 --- a/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp +++ b/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp @@ -111,9 +111,7 @@ void tst_QTemporaryFile::initTestCase() QString sourceDir(":/android_testdata/"); QDirIterator it(sourceDir, QDirIterator::Subdirectories); while (it.hasNext()) { - it.next(); - - QFileInfo sourceFileInfo = it.fileInfo(); + QFileInfo sourceFileInfo = it.nextFileInfo(); if (!sourceFileInfo.isDir()) { QFileInfo destinationFileInfo(QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + QLatin1Char('/') + sourceFileInfo.filePath().mid(sourceDir.length())); diff --git a/tests/auto/tools/rcc/tst_rcc.cpp b/tests/auto/tools/rcc/tst_rcc.cpp index 9b04987168..359ee7021e 100644 --- a/tests/auto/tools/rcc/tst_rcc.cpp +++ b/tests/auto/tools/rcc/tst_rcc.cpp @@ -274,8 +274,7 @@ void tst_rcc::binary_data() QDirIterator iter(dataPath, QStringList() << QLatin1String("*.qrc")); while (iter.hasNext()) { - iter.next(); - QFileInfo qrcFileInfo = iter.fileInfo(); + QFileInfo qrcFileInfo = iter.nextFileInfo(); QString absoluteBaseName = QFileInfo(qrcFileInfo.absolutePath(), qrcFileInfo.baseName()).absoluteFilePath(); QString rccFileName = absoluteBaseName + QLatin1String(".rcc"); diff --git a/tests/benchmarks/corelib/io/qdir/10000/bench_qdir_10000.cpp b/tests/benchmarks/corelib/io/qdir/10000/bench_qdir_10000.cpp index 3184df0d7b..e02cfb3099 100644 --- a/tests/benchmarks/corelib/io/qdir/10000/bench_qdir_10000.cpp +++ b/tests/benchmarks/corelib/io/qdir/10000/bench_qdir_10000.cpp @@ -83,9 +83,9 @@ private slots: QBENCHMARK { QDirIterator dit(testdir.path(), QDir::Files); while (dit.hasNext()) { - dit.next(); - dit.fileInfo().isDir(); - dit.fileInfo().size(); + const auto fi = dit.nextFileInfo(); + (void)fi.isDir(); + (void)fi.size(); } } } @@ -104,9 +104,9 @@ private slots: QBENCHMARK { QDirIterator dit(testdir.path()); while (dit.hasNext()) { - dit.next(); - dit.fileInfo().isDir(); - dit.fileInfo().size(); + const auto fi = dit.nextFileInfo(); + (void)fi.isDir(); + (void)fi.size(); } } } diff --git a/tests/benchmarks/corelib/io/qdir/tree/bench_qdir_tree.cpp b/tests/benchmarks/corelib/io/qdir/tree/bench_qdir_tree.cpp index 0abf8769a6..3a7db36ea2 100644 --- a/tests/benchmarks/corelib/io/qdir/tree/bench_qdir_tree.cpp +++ b/tests/benchmarks/corelib/io/qdir/tree/bench_qdir_tree.cpp @@ -211,9 +211,8 @@ private slots: int count = 0; QDirIterator iter(dirName, QDir::Files, QDirIterator::Subdirectories); while(iter.hasNext()) { - iter.next(); count++; - totalsize += iter.fileInfo().size(); + totalsize += iter.nextFileInfo().size(); } QCOMPARE(count, 1000); QCOMPARE(totalsize, expectedSize); diff --git a/tests/benchmarks/corelib/io/qdiriterator/main.cpp b/tests/benchmarks/corelib/io/qdiriterator/main.cpp index 8c180f8757..acf1ede368 100644 --- a/tests/benchmarks/corelib/io/qdiriterator/main.cpp +++ b/tests/benchmarks/corelib/io/qdiriterator/main.cpp @@ -189,13 +189,13 @@ void tst_qdiriterator::diriterator() QDirIterator::Subdirectories); while (dir.hasNext()) { - dir.next(); + const auto fi = dir.nextFileInfo(); //printf("%s\n", qPrintable(dir.fileName())); 0 && printf("%d %s\n", - dir.fileInfo().isDir(), - //qPrintable(dir.fileInfo().absoluteFilePath()), + fi.isDir(), + //qPrintable(fi.absoluteFilePath()), //qPrintable(dir.path()), - qPrintable(dir.filePath())); + qPrintable(fi.filePath())); ++c; } count = c; |