8#include "qplatformdefs.h"
10#include <QtCore/qt_windows.h>
11#include <QtCore/private/wcharhelpers_win_p.h>
15using namespace Qt::StringLiterals;
19QFileSystemIterator::QFileSystemIterator(
const QFileSystemEntry &entry)
20 : dirPath(entry.filePath())
21 , nativePath(entry.nativeFilePath())
22 , findFileHandle(INVALID_HANDLE_VALUE)
27 if (nativePath.endsWith(u".lnk"_s) && !QFileSystemEngine::isDirPath(dirPath,
nullptr)) {
29 QFileSystemEntry link = QFileSystemEngine::getLinkTarget(entry, metaData);
30 nativePath = link.nativeFilePath();
32 if (!nativePath.endsWith(u'\\'))
33 nativePath.append(u'\\');
34 nativePath.append(u'*');
36 if (!dirPath.endsWith(u'/'))
40QFileSystemIterator::QFileSystemIterator(
const QFileSystemEntry &entry, QDir::Filters filters)
41 : QFileSystemIterator(entry)
43 if ((filters & (QDir::Dirs|QDir::Drives)) && (!(filters & (QDir::Files))))
47QFileSystemIterator::QFileSystemIterator(
const QFileSystemEntry &entry,
48 QDirListing::IteratorFlags flags)
49 : QFileSystemIterator(entry)
51 onlyDirs = flags.testAnyFlags(QDirListing::IteratorFlag::DirsOnly);
54QFileSystemIterator::~QFileSystemIterator()
56 if (findFileHandle != INVALID_HANDLE_VALUE)
57 FindClose(findFileHandle);
65 QFileSystemEntry entry(nativePath.chopped(1), QFileSystemEntry::FromNativePath());
66 return QFileSystemEngine::nativeId(entry);
69std::optional<QDirEntryInfo> QFileSystemIterator::advance()
71 bool haveData =
false;
72 WIN32_FIND_DATA findData;
74 if (findFileHandle == INVALID_HANDLE_VALUE && !uncFallback) {
77 DWORD dwAdditionalFlags = 0;
78 dwAdditionalFlags = 2;
83 findFileHandle = FindFirstFileEx(qt_castToWchar(nativePath),
84 FINDEX_INFO_LEVELS(infoLevel), &findData,
85 FINDEX_SEARCH_OPS(searchOps), 0, dwAdditionalFlags);
86 if (findFileHandle == INVALID_HANDLE_VALUE) {
87 if (nativePath.startsWith(
"\\\\?\\UNC\\"_L1)) {
88 const auto parts = QStringView{nativePath}.split(u'\\', Qt::SkipEmptyParts);
89 if (parts.count() == 4 && QFileSystemEngine::uncListSharesOnServer(
90 "\\\\"_L1 + parts.at(2), &uncShares)) {
91 if (uncShares.isEmpty())
98 if (findFileHandle == INVALID_HANDLE_VALUE && !uncFallback)
103 if (++uncShareIndex >= uncShares.count())
106 if (!FindNextFile(findFileHandle, &findData))
111 QFileSystemEntry fileEntry;
114 fileEntry = QFileSystemEntry(dirPath + uncShares.at(uncShareIndex));
115 metaData.fillFromFileAttribute(FILE_ATTRIBUTE_DIRECTORY);
117 QString fileName = QString::fromWCharArray(findData.cFileName);
118 fileEntry = QFileSystemEntry(dirPath + fileName);
119 if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY || !fileName.endsWith(
".lnk"_L1)) {
120 metaData.fillFromFindData(findData,
true);
123 return QDirEntryInfo{std::move(fileEntry), std::move(metaData)};
Combined button and popup list for selecting options.