diff options
-rw-r--r-- | src/corelib/io/qdir.cpp | 26 | ||||
-rw-r--r-- | src/corelib/io/qdir_p.h | 2 |
2 files changed, 20 insertions, 8 deletions
diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp index 21204ff10b..b08595bf14 100644 --- a/src/corelib/io/qdir.cpp +++ b/src/corelib/io/qdir.cpp @@ -100,7 +100,7 @@ QDirPrivate::QDirPrivate(const QDirPrivate ©) dirEntry(copy.dirEntry) { QMutexLocker locker(©.fileCache.mutex); - fileCache.fileListsInitialized = copy.fileCache.fileListsInitialized; + fileCache.fileListsInitialized = copy.fileCache.fileListsInitialized.load(); fileCache.files = copy.fileCache.files; fileCache.fileInfos = copy.fileCache.fileInfos; fileCache.absoluteDirEntry = copy.fileCache.absoluteDirEntry; @@ -1378,17 +1378,29 @@ QStringList QDir::entryList(const QStringList &nameFilters, Filters filters, if (sort == NoSort) sort = d->sort; + const bool needsSorting = (sort & QDir::SortByMask) != QDir::Unsorted; + if (filters == d->filters && sort == d->sort && nameFilters == d->nameFilters) { - d->initFileLists(*this); - return d->fileCache.files; + // Don't fill a QFileInfo cache if we just need names + if (needsSorting || d->fileCache.fileListsInitialized) { + d->initFileLists(*this); + return d->fileCache.files; + } } - QFileInfoList l; QDirIterator it(d->dirEntry.filePath(), nameFilters, filters); - while (it.hasNext()) - l.append(it.nextFileInfo()); QStringList ret; - d->sortFileList(sort, l, &ret, nullptr); + if (needsSorting) { + QFileInfoList l; + while (it.hasNext()) + l.append(it.nextFileInfo()); + d->sortFileList(sort, l, &ret, nullptr); + } else { + while (it.hasNext()) { + it.next(); + ret.append(it.fileName()); + } + } return ret; } diff --git a/src/corelib/io/qdir_p.h b/src/corelib/io/qdir_p.h index 3e033b2ad2..7dce69c195 100644 --- a/src/corelib/io/qdir_p.h +++ b/src/corelib/io/qdir_p.h @@ -71,7 +71,7 @@ public: QMutex mutex; QStringList files; QFileInfoList fileInfos; - bool fileListsInitialized = false; + std::atomic<bool> fileListsInitialized = false; QFileSystemEntry absoluteDirEntry; QFileSystemMetaData metaData; }; |