21 auto maybeCacheEntry = [
this, name](
const QFileSystemEntry &entry, QAbstractFileEngine::FileName filename) {
22 int pathname =
int(filename + 1);
26 QString filePath = entry.filePath();
27 QString path = entry.path();
30 fileNames[filename] = filePath;
31 fileNames[pathname] = path;
33 return name == pathname ? path : filePath;
35 if (cache_enabled && !fileNames[(
int)name].isNull())
36 return fileNames[(
int)name];
39 if (fileEngine ==
nullptr) {
41 case QAbstractFileEngine::CanonicalName:
42 case QAbstractFileEngine::CanonicalPathName: {
43 static_assert(
int(QAbstractFileEngine::CanonicalName) + 1 ==
int(QAbstractFileEngine::CanonicalPathName));
44 QFileSystemEntry entry = QFileSystemEngine::canonicalName(fileEntry, metaData);
45 ret = maybeCacheEntry(entry, QAbstractFileEngine::CanonicalName);
48 case QAbstractFileEngine::AbsoluteLinkTarget:
49 ret = QFileSystemEngine::getLinkTarget(fileEntry, metaData).filePath();
51 case QAbstractFileEngine::RawLinkPath:
52 ret = QFileSystemEngine::getRawLinkPath(fileEntry, metaData).filePath();
54 case QAbstractFileEngine::JunctionName:
55 ret = QFileSystemEngine::getJunctionTarget(fileEntry, metaData).filePath();
57 case QAbstractFileEngine::BundleName:
58 ret = QFileSystemEngine::bundleName(fileEntry);
60 case QAbstractFileEngine::AbsoluteName:
61 case QAbstractFileEngine::AbsolutePathName: {
62 static_assert(
int(QAbstractFileEngine::AbsoluteName) + 1 ==
int(QAbstractFileEngine::AbsolutePathName));
63 QFileSystemEntry entry = QFileSystemEngine::absoluteName(fileEntry);
64 ret = maybeCacheEntry(entry, QAbstractFileEngine::AbsoluteName);
70 ret = fileEngine->fileName(name);
75 fileNames[(
int)name] = ret;
81 if (cache_enabled && !fileOwners[(
int)own].isNull())
82 return fileOwners[(
int)own];
84 if (fileEngine ==
nullptr) {
86 case QAbstractFileEngine::OwnerUser:
87 ret = QFileSystemEngine::resolveUserName(fileEntry, metaData);
89 case QAbstractFileEngine::OwnerGroup:
90 ret = QFileSystemEngine::resolveGroupName(fileEntry, metaData);
94 ret = fileEngine->owner(own);
99 fileOwners[(
int)own] = ret;
105 Q_ASSERT(fileEngine);
115 QAbstractFileEngine::FileFlags req;
116 uint cachedFlags = 0;
118 if (request & (QAbstractFileEngine::FlagsMask | QAbstractFileEngine::TypesMask)) {
119 if (!getCachedFlag(CachedFileFlags)) {
120 req |= QAbstractFileEngine::FlagsMask;
121 req |= QAbstractFileEngine::TypesMask;
122 req &= (~QAbstractFileEngine::LinkType);
123 req &= (~QAbstractFileEngine::BundleType);
128 if (request & QAbstractFileEngine::LinkType) {
129 if (!getCachedFlag(CachedLinkTypeFlag)) {
130 req |= QAbstractFileEngine::LinkType;
135 if (request & QAbstractFileEngine::BundleType) {
136 if (!getCachedFlag(CachedBundleTypeFlag)) {
137 req |= QAbstractFileEngine::BundleType;
143 if (request & QAbstractFileEngine::PermsMask) {
144 if (!getCachedFlag(CachedPerms)) {
145 req |= QAbstractFileEngine::PermsMask;
152 req &= (~QAbstractFileEngine::Refresh);
154 req |= QAbstractFileEngine::Refresh;
156 QAbstractFileEngine::FileFlags flags = fileEngine->fileFlags(req);
157 fileFlags |= uint(flags.toInt());
158 setCachedFlag(cachedFlags);
161 return fileFlags & request.toInt();
471 if (rhs.d_ptr == lhs.d_ptr)
473 if (lhs.d_ptr->isDefaultConstructed || rhs.d_ptr->isDefaultConstructed)
477 if (lhs.d_ptr->fileEntry.filePath() == rhs.d_ptr->fileEntry.filePath())
480 Qt::CaseSensitivity sensitive;
481 if (lhs.d_ptr->fileEngine ==
nullptr || rhs.d_ptr->fileEngine ==
nullptr) {
482 if (lhs.d_ptr->fileEngine != rhs.d_ptr->fileEngine)
485 const bool lhsCaseSensitive = QFileSystemEngine::isCaseSensitive(lhs.d_ptr->fileEntry, lhs.d_ptr->metaData);
486 if (lhsCaseSensitive != QFileSystemEngine::isCaseSensitive(rhs.d_ptr->fileEntry, rhs.d_ptr->metaData))
489 sensitive = lhsCaseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive;
491 if (lhs.d_ptr->fileEngine->caseSensitive() != rhs.d_ptr->fileEngine->caseSensitive())
493 sensitive = lhs.d_ptr->fileEngine->caseSensitive() ? Qt::CaseSensitive : Qt::CaseInsensitive;
497 return lhs.canonicalFilePath().compare(rhs.canonicalFilePath(), sensitive) == 0;
744bool QFileInfo::exists()
const
746 Q_D(
const QFileInfo);
747 if (d->isDefaultConstructed)
749 if (d->fileEngine ==
nullptr) {
750 if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::ExistsAttribute))
751 QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::ExistsAttribute);
752 return d->metaData.exists();
754 return d->getFileFlags(QAbstractFileEngine::ExistsFlag);
769bool QFileInfo::exists(
const QString &path)
773 QFileSystemEntry entry(path);
774 QFileSystemMetaData data;
776 if (
auto engine = QFileSystemEngine::createLegacyEngine(entry, data))
777 return QFileInfo(
new QFileInfoPrivate(entry, data, std::move(engine))).exists();
779 QFileSystemEngine::fillMetaData(entry, data, QFileSystemMetaData::ExistsAttribute);
780 return data.exists();
889QString QFileInfo::completeBaseName()
const
891 Q_D(
const QFileInfo);
892 if (d->isDefaultConstructed)
895 return d->fileEntry.completeBaseName();
896 const QString fileEngineBaseName = d->fileEngine->fileName(QAbstractFileEngine::BaseName);
897 return QFileSystemEntry(fileEngineBaseName).completeBaseName();
1032bool QFileInfo::isExecutable()
const
1034 Q_D(
const QFileInfo);
1035 return d->checkAttribute<
bool>(
1036 QFileSystemMetaData::UserExecutePermission,
1037 [d]() {
return d->metaData.isExecutable(); },
1038 [d]() {
return d->getFileFlags(QAbstractFileEngine::ExeUserPerm); });
1229bool QFileInfo::isOther()
const
1231 Q_D(
const QFileInfo);
1232 using M = QFileSystemMetaData::MetaDataFlag;
1235 constexpr auto mdFlags = M::ExistsAttribute | M::DirectoryType | M::FileType | M::WinLnkType;
1237 auto fsLambda = [d]() {
1240 if (d->metaData.isLnkFile())
1242 return d->metaData.exists() && !d->metaData.isDirectory() && !d->metaData.isFile();
1245 auto engineLambda = [d]() {
1246 using F = QAbstractFileEngine::FileFlag;
1247 return d->getFileFlags(F::ExistsFlag)
1248 && !d->getFileFlags(F::LinkType)
1249 && !d->getFileFlags(F::DirectoryType)
1250 && !d->getFileFlags(F::FileType);
1253 return d->checkAttribute<
bool>(mdFlags, std::move(fsLambda), std::move(engineLambda));
1331bool QFileInfo::isRoot()
const
1333 Q_D(
const QFileInfo);
1334 if (d->isDefaultConstructed)
1336 if (d->fileEngine ==
nullptr) {
1337 if (d->fileEntry.isRoot()) {
1338#if defined(Q_OS_WIN)
1341 if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::ExistsAttribute))
1342 QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::ExistsAttribute);
1343 return d->metaData.exists();
1350 return d->getFileFlags(QAbstractFileEngine::RootFlag);
1446uint QFileInfo::ownerId()
const
1448 Q_D(
const QFileInfo);
1449 return d->checkAttribute(uint(-2),
1450 QFileSystemMetaData::UserId,
1451 [d]() {
return d->metaData.userId(); },
1452 [d]() {
return d->fileEngine->ownerId(QAbstractFileEngine::OwnerUser); });
1485uint QFileInfo::groupId()
const
1487 Q_D(
const QFileInfo);
1488 return d->checkAttribute(uint(-2),
1489 QFileSystemMetaData::GroupId,
1490 [d]() {
return d->metaData.groupId(); },
1491 [d]() {
return d->fileEngine->ownerId(QAbstractFileEngine::OwnerGroup); });
1512bool QFileInfo::permission(QFile::Permissions permissions)
const
1514 Q_D(
const QFileInfo);
1516 auto fseFlags = QFileSystemMetaData::MetaDataFlags::fromInt(permissions.toInt());
1517 auto feFlags = QAbstractFileEngine::FileFlags::fromInt(permissions.toInt());
1518 return d->checkAttribute<
bool>(
1520 [=]() {
return (d->metaData.permissions() & permissions) == permissions; },
1522 return d->getFileFlags(feFlags) == uint(permissions.toInt());
1535QFile::Permissions QFileInfo::permissions()
const
1537 Q_D(
const QFileInfo);
1538 return d->checkAttribute<QFile::Permissions>(
1539 QFileSystemMetaData::Permissions,
1540 [d]() {
return d->metaData.permissions(); },
1542 return QFile::Permissions(d->getFileFlags(QAbstractFileEngine::PermsMask) & QAbstractFileEngine::PermsMask);
1555qint64 QFileInfo::size()
const
1557 Q_D(
const QFileInfo);
1558 return d->checkAttribute<qint64>(
1559 QFileSystemMetaData::SizeAttribute,
1560 [d]() {
return d->metaData.size(); },
1562 if (!d->getCachedFlag(QFileInfoPrivate::CachedSize)) {
1563 d->setCachedFlag(QFileInfoPrivate::CachedSize);
1564 d->fileSize = d->fileEngine->size();
1743QDateTime QFileInfo::fileTime(QFile::FileTime time,
const QTimeZone &tz)
const
1745 Q_D(
const QFileInfo);
1746 QFileSystemMetaData::MetaDataFlags flag;
1748 case QFile::FileAccessTime:
1749 flag = QFileSystemMetaData::AccessTime;
1751 case QFile::FileBirthTime:
1752 flag = QFileSystemMetaData::BirthTime;
1754 case QFile::FileMetadataChangeTime:
1755 flag = QFileSystemMetaData::MetadataChangeTime;
1757 case QFile::FileModificationTime:
1758 flag = QFileSystemMetaData::ModificationTime;
1762 auto fsLambda = [d, time]() {
return d->metaData.fileTime(time); };
1763 auto engineLambda = [d, time]() {
return d->getFileTime(time); };
1765 d->checkAttribute<QDateTime>(flag, std::move(fsLambda), std::move(engineLambda));
1766 return dt.toTimeZone(tz);