220 if (nameFilters.contains(
"*"_L1))
223#if QT_CONFIG(regularexpression)
224 nameRegExps.reserve(size_t(nameFilters.size()));
226 const bool isCase = iteratorFlags.testAnyFlags(QDirListing::IteratorFlag::CaseSensitive);
227 const auto cs = isCase ? Qt::CaseSensitive : Qt::CaseInsensitive;
228 for (
const auto &filter : std::as_const(nameFilters))
229 nameRegExps.emplace_back(QRegularExpression::fromWildcard(filter, cs));
232 engine = QFileSystemEngine::createLegacyEngine(initialEntryInfo.entry,
233 initialEntryInfo.metaData);
254 const QString path = [&entryInfo] {
256 if (entryInfo.isSymLink())
257 return entryInfo.canonicalFilePath();
259 return entryInfo.filePath();
263 if (iteratorFlags.testAnyFlags(QDirListing::IteratorFlag::FollowDirSymlinks)) {
265 if (visitedLinks.hasSeen(entryInfo.canonicalFilePath()))
270 engine->setFileName(path);
271 if (
auto it = engine->beginEntryList(path, iteratorFlags, nameFilters)) {
272 fileEngineIterators.push(std::move(it));
277#ifndef QT_NO_FILESYSTEMITERATOR
278 QFileSystemEntry *fentry =
nullptr;
279 if (entryInfo.fileInfoOpt)
280 fentry = &entryInfo.fileInfoOpt->d_ptr->fileEntry;
282 fentry = &entryInfo.entry;
283 nativeIterators.push(std::make_unique<QFileSystemIterator>(*fentry, iteratorFlags));
285 qWarning(
"Qt was built with -no-feature-filesystemiterator: no files/plugins will be found!");
313 while (!fileEngineIterators.empty()) {
316 while (fileEngineIterators.top()->advance()) {
317 QDirEntryInfo entryInfo{fileEngineIterators.top()->currentFileInfo()};
318 if (entryMatches(entryInfo)) {
319 currentEntryInfo = std::move(entryInfo);
324 fileEngineIterators.pop();
327#ifndef QT_NO_FILESYSTEMITERATOR
328 while (!nativeIterators.empty()) {
331 while (std::optional r = nativeIterators.top()->advance()) {
332 if (entryMatches(*r)) {
333 currentEntryInfo = std::move(*r);
338 nativeIterators.pop();
351 using F = QDirListing::IteratorFlag;
353 if (!iteratorFlags.testAnyFlags(F::Recursive))
357 if (!iteratorFlags.testAnyFlags(F::FollowDirSymlinks) && entryInfo.isSymLink())
361 if (isDotOrDotDot(entryInfo.fileName()))
365 const bool includeHidden = iteratorFlags.testAnyFlags(QDirListing::IteratorFlag::IncludeHidden);
366 if (!includeHidden && entryInfo.isHidden())
370 if (!entryInfo.isDir())
373 pushDirectory(entryInfo);
385 using F = QDirListing::IteratorFlag;
387 const QString &fileName = entryInfo.fileName();
388 if (fileName.isEmpty())
392#if QT_CONFIG(regularexpression)
393 const bool skipNameFilters = iteratorFlags.testAnyFlags(F::NoNameFiltersForDirs)
394 && entryInfo.isDir();
395 if (!skipNameFilters) {
396 if (!regexMatchesName(fileName))
401 if (isDotOrDotDot(fileName))
402 return iteratorFlags.testFlags(F::IncludeDotAndDotDot);
404 if (!iteratorFlags.testAnyFlag(F::IncludeHidden) && entryInfo.isHidden())
407 const bool includeBrokenSymlinks = iteratorFlags.testAnyFlags(F::IncludeBrokenSymlinks);
408 if (includeBrokenSymlinks && entryInfo.isSymLink() && !entryInfo.exists())
411 if (iteratorFlags.testFlag(F::ResolveSymlinks)) {
412 if (entryInfo.isSymLink() && !entryInfo.exists())
415 constexpr auto f = F::ExcludeFiles | F::ExcludeDirs | F::ExcludeOther;
416 const bool filterByTargetType = iteratorFlags.testAnyFlags(f);
417 if (filterByTargetType && entryInfo.isSymLink())
421 if (iteratorFlags.testAnyFlag(F::ExcludeOther)
422 && !entryInfo.isFile() && !entryInfo.isDir() && !entryInfo.isSymLink()) {
426 if (iteratorFlags.testAnyFlags(F::ExcludeDirs) && entryInfo.isDir())
429 if (iteratorFlags.testAnyFlags(F::ExcludeFiles) && entryInfo.isFile())
Q_CORE_EXPORT bool isReadable() const
Q_CORE_EXPORT bool isHidden() const
Q_CORE_EXPORT bool isWritable() const
Q_CORE_EXPORT bool isExecutable() const
Q_CORE_EXPORT bool isFile() const
Q_CORE_EXPORT bool exists() const
Q_CORE_EXPORT bool isSymLink() const
Q_CORE_EXPORT bool isDir() const