summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorElvis Angelaccio <elvis.angelaccio@kde.org>2016-09-12 18:48:17 +0200
committerElvis Angelaccio <elvis.angelaccio@kde.org>2017-01-08 16:11:34 +0000
commit3f455a4b53254b3ebbafae91600a63caebee3e0e (patch)
tree5e63f750d03de84307369c66c0bfac144b238adf
parent5311d481c2159c0076afc31c1276e1bd5b674fc4 (diff)
Introduce QDir::isEmpty()
A directory is empty when it doesn't contain files or folders. We can exploit QDirIterator::hasNext() to check whether this is the case. This is efficient since it doesn't list the whole folder (in the non-empty case). Test cases are added for both the empty and non-empty cases. Change-Id: I0f7e26782c0f97f9c16f928dab6cae37927875d8 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r--src/corelib/io/qdir.cpp20
-rw-r--r--src/corelib/io/qdir.h2
-rw-r--r--tests/auto/corelib/io/qdir/tst_qdir.cpp23
3 files changed, 45 insertions, 0 deletions
diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp
index 437f774547..37795ae5c4 100644
--- a/src/corelib/io/qdir.cpp
+++ b/src/corelib/io/qdir.cpp
@@ -1843,6 +1843,26 @@ bool QDir::exists(const QString &name) const
}
/*!
+ Returns whether the directory is empty.
+
+ Equivalent to \c{count() == 0} with filters
+ \c{QDir::AllEntries | QDir::NoDotAndDotDot}, but faster as it just checks
+ whether the directory contains at least one entry.
+
+ \note Unless you set the \p filters flags to include \c{QDir::NoDotAndDotDot}
+ (as the default value does), no directory is empty.
+
+ \sa count(), entryList(), setFilter()
+ \since 5.9
+*/
+bool QDir::isEmpty(Filters filters) const
+{
+ const auto d = d_ptr.constData();
+ QDirIterator it(d->dirEntry.filePath(), d->nameFilters, filters);
+ return !it.hasNext();
+}
+
+/*!
Returns a list of the root directories on this system.
On Windows this returns a list of QFileInfo objects containing "C:/",
diff --git a/src/corelib/io/qdir.h b/src/corelib/io/qdir.h
index ef7ec2c701..950a26f327 100644
--- a/src/corelib/io/qdir.h
+++ b/src/corelib/io/qdir.h
@@ -144,6 +144,8 @@ public:
void setSorting(SortFlags sort);
uint count() const;
+ bool isEmpty(Filters filters = Filters(AllEntries | NoDotAndDotDot)) const;
+
QString operator[](int) const;
static QStringList nameFiltersFromString(const QString &nameFilter);
diff --git a/tests/auto/corelib/io/qdir/tst_qdir.cpp b/tests/auto/corelib/io/qdir/tst_qdir.cpp
index b86c6e4dfa..49ee8eb32c 100644
--- a/tests/auto/corelib/io/qdir/tst_qdir.cpp
+++ b/tests/auto/corelib/io/qdir/tst_qdir.cpp
@@ -211,6 +211,9 @@ private slots:
void cdBelowRoot_data();
void cdBelowRoot();
+ void emptyDir();
+ void nonEmptyDir();
+
private:
#ifdef BUILTIN_TESTDATA
QString m_dataPath;
@@ -2281,6 +2284,26 @@ void tst_QDir::cdBelowRoot()
QCOMPARE(dir.path(), rootPath);
}
+void tst_QDir::emptyDir()
+{
+ const QString tempDir = QDir::currentPath() + "/tmpdir/";
+ QVERIFY(QDir().mkdir(tempDir));
+ QVERIFY(QDir(tempDir).mkdir("emptyDirectory"));
+
+ QDir testDir(tempDir + "emptyDirectory");
+ QVERIFY(testDir.isEmpty());
+ QVERIFY(!testDir.isEmpty(QDir::AllEntries));
+ QVERIFY(!testDir.isEmpty(QDir::AllEntries | QDir::NoDot));
+ QVERIFY(!testDir.isEmpty(QDir::AllEntries | QDir::NoDotDot));
+ QVERIFY(QDir(tempDir).removeRecursively());
+}
+
+void tst_QDir::nonEmptyDir()
+{
+ const QDir dir(m_dataPath);
+ QVERIFY(!dir.isEmpty());
+}
+
QTEST_MAIN(tst_QDir)
#include "tst_qdir.moc"