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);
60bool QFileSystemIterator::advance(QFileSystemEntry &fileEntry, QFileSystemMetaData &metaData)
62 bool haveData =
false;
63 WIN32_FIND_DATA findData;
65 if (findFileHandle == INVALID_HANDLE_VALUE && !uncFallback) {
68 DWORD dwAdditionalFlags = 0;
69 dwAdditionalFlags = 2;
74 findFileHandle = FindFirstFileEx(qt_castToWchar(nativePath),
75 FINDEX_INFO_LEVELS(infoLevel), &findData,
76 FINDEX_SEARCH_OPS(searchOps), 0, dwAdditionalFlags);
77 if (findFileHandle == INVALID_HANDLE_VALUE) {
78 if (nativePath.startsWith(
"\\\\?\\UNC\\"_L1)) {
79 const auto parts = QStringView{nativePath}.split(u'\\', Qt::SkipEmptyParts);
80 if (parts.count() == 4 && QFileSystemEngine::uncListSharesOnServer(
81 "\\\\"_L1 + parts.at(2), &uncShares)) {
82 if (uncShares.isEmpty())
89 if (findFileHandle == INVALID_HANDLE_VALUE && !uncFallback)
94 if (++uncShareIndex >= uncShares.count())
97 if (!FindNextFile(findFileHandle, &findData))
103 fileEntry = QFileSystemEntry(dirPath + uncShares.at(uncShareIndex));
104 metaData.fillFromFileAttribute(FILE_ATTRIBUTE_DIRECTORY);
107 QString fileName = QString::fromWCharArray(findData.cFileName);
108 fileEntry = QFileSystemEntry(dirPath + fileName);
109 metaData = QFileSystemMetaData();
110 if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY || !fileName.endsWith(
".lnk"_L1)) {
111 metaData.fillFromFindData(findData,
true);