21 if (cache_enabled && !fileNames[(
int)name].isNull())
22 return fileNames[(
int)name];
25 if (fileEngine ==
nullptr) {
27 case QAbstractFileEngine::CanonicalName:
28 case QAbstractFileEngine::CanonicalPathName: {
29 QFileSystemEntry entry = QFileSystemEngine::canonicalName(fileEntry, metaData);
31 fileNames[QAbstractFileEngine::CanonicalName] = entry.filePath();
32 fileNames[QAbstractFileEngine::CanonicalPathName] = entry.path();
34 if (name == QAbstractFileEngine::CanonicalName)
35 ret = entry.filePath();
40 case QAbstractFileEngine::AbsoluteLinkTarget:
41 ret = QFileSystemEngine::getLinkTarget(fileEntry, metaData).filePath();
43 case QAbstractFileEngine::RawLinkPath:
44 ret = QFileSystemEngine::getRawLinkPath(fileEntry, metaData).filePath();
46 case QAbstractFileEngine::JunctionName:
47 ret = QFileSystemEngine::getJunctionTarget(fileEntry, metaData).filePath();
49 case QAbstractFileEngine::BundleName:
50 ret = QFileSystemEngine::bundleName(fileEntry);
52 case QAbstractFileEngine::AbsoluteName:
53 case QAbstractFileEngine::AbsolutePathName: {
54 QFileSystemEntry entry = QFileSystemEngine::absoluteName(fileEntry);
56 fileNames[QAbstractFileEngine::AbsoluteName] = entry.filePath();
57 fileNames[QAbstractFileEngine::AbsolutePathName] = entry.path();
59 if (name == QAbstractFileEngine::AbsoluteName)
60 ret = entry.filePath();
68 ret = fileEngine->fileName(name);
73 fileNames[(
int)name] = ret;
79 if (cache_enabled && !fileOwners[(
int)own].isNull())
80 return fileOwners[(
int)own];
82 if (fileEngine ==
nullptr) {
84 case QAbstractFileEngine::OwnerUser:
85 ret = QFileSystemEngine::resolveUserName(fileEntry, metaData);
87 case QAbstractFileEngine::OwnerGroup:
88 ret = QFileSystemEngine::resolveGroupName(fileEntry, metaData);
92 ret = fileEngine->owner(own);
97 fileOwners[(
int)own] = ret;
103 Q_ASSERT(fileEngine);
113 QAbstractFileEngine::FileFlags req;
114 uint cachedFlags = 0;
116 if (request & (QAbstractFileEngine::FlagsMask | QAbstractFileEngine::TypesMask)) {
117 if (!getCachedFlag(CachedFileFlags)) {
118 req |= QAbstractFileEngine::FlagsMask;
119 req |= QAbstractFileEngine::TypesMask;
120 req &= (~QAbstractFileEngine::LinkType);
121 req &= (~QAbstractFileEngine::BundleType);
126 if (request & QAbstractFileEngine::LinkType) {
127 if (!getCachedFlag(CachedLinkTypeFlag)) {
128 req |= QAbstractFileEngine::LinkType;
133 if (request & QAbstractFileEngine::BundleType) {
134 if (!getCachedFlag(CachedBundleTypeFlag)) {
135 req |= QAbstractFileEngine::BundleType;
141 if (request & QAbstractFileEngine::PermsMask) {
142 if (!getCachedFlag(CachedPerms)) {
143 req |= QAbstractFileEngine::PermsMask;
150 req &= (~QAbstractFileEngine::Refresh);
152 req |= QAbstractFileEngine::Refresh;
154 QAbstractFileEngine::FileFlags flags = fileEngine->fileFlags(req);
155 fileFlags |= uint(flags.toInt());
156 setCachedFlag(cachedFlags);
159 return fileFlags & request.toInt();
469 if (rhs.d_ptr == lhs.d_ptr)
471 if (lhs.d_ptr->isDefaultConstructed || rhs.d_ptr->isDefaultConstructed)
475 if (lhs.d_ptr->fileEntry.filePath() == rhs.d_ptr->fileEntry.filePath())
478 Qt::CaseSensitivity sensitive;
479 if (lhs.d_ptr->fileEngine ==
nullptr || rhs.d_ptr->fileEngine ==
nullptr) {
480 if (lhs.d_ptr->fileEngine != rhs.d_ptr->fileEngine)
483 const bool lhsCaseSensitive = QFileSystemEngine::isCaseSensitive(lhs.d_ptr->fileEntry, lhs.d_ptr->metaData);
484 if (lhsCaseSensitive != QFileSystemEngine::isCaseSensitive(rhs.d_ptr->fileEntry, rhs.d_ptr->metaData))
487 sensitive = lhsCaseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive;
489 if (lhs.d_ptr->fileEngine->caseSensitive() != rhs.d_ptr->fileEngine->caseSensitive())
491 sensitive = lhs.d_ptr->fileEngine->caseSensitive() ? Qt::CaseSensitive : Qt::CaseInsensitive;
495 return lhs.canonicalFilePath().compare(rhs.canonicalFilePath(), sensitive) == 0;
737bool QFileInfo::exists()
const
739 Q_D(
const QFileInfo);
740 if (d->isDefaultConstructed)
742 if (d->fileEngine ==
nullptr) {
743 if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::ExistsAttribute))
744 QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::ExistsAttribute);
745 return d->metaData.exists();
747 return d->getFileFlags(QAbstractFileEngine::ExistsFlag);
762bool QFileInfo::exists(
const QString &path)
766 QFileSystemEntry entry(path);
767 QFileSystemMetaData data;
769 if (
auto engine = QFileSystemEngine::createLegacyEngine(entry, data))
770 return QFileInfo(
new QFileInfoPrivate(entry, data, std::move(engine))).exists();
772 QFileSystemEngine::fillMetaData(entry, data, QFileSystemMetaData::ExistsAttribute);
773 return data.exists();
882QString QFileInfo::completeBaseName()
const
884 Q_D(
const QFileInfo);
885 if (d->isDefaultConstructed)
888 return d->fileEntry.completeBaseName();
889 const QString fileEngineBaseName = d->fileEngine->fileName(QAbstractFileEngine::BaseName);
890 return QFileSystemEntry(fileEngineBaseName).completeBaseName();
1025bool QFileInfo::isExecutable()
const
1027 Q_D(
const QFileInfo);
1028 return d->checkAttribute<
bool>(
1029 QFileSystemMetaData::UserExecutePermission,
1030 [d]() {
return d->metaData.isExecutable(); },
1031 [d]() {
return d->getFileFlags(QAbstractFileEngine::ExeUserPerm); });
1222bool QFileInfo::isOther()
const
1224 Q_D(
const QFileInfo);
1225 using M = QFileSystemMetaData::MetaDataFlag;
1228 constexpr auto mdFlags = M::ExistsAttribute | M::DirectoryType | M::FileType | M::WinLnkType;
1230 auto fsLambda = [d]() {
1233 if (d->metaData.isLnkFile())
1235 return d->metaData.exists() && !d->metaData.isDirectory() && !d->metaData.isFile();
1238 auto engineLambda = [d]() {
1239 using F = QAbstractFileEngine::FileFlag;
1240 return d->getFileFlags(F::ExistsFlag)
1241 && !d->getFileFlags(F::LinkType)
1242 && !d->getFileFlags(F::DirectoryType)
1243 && !d->getFileFlags(F::FileType);
1246 return d->checkAttribute<
bool>(mdFlags, std::move(fsLambda), std::move(engineLambda));
1324bool QFileInfo::isRoot()
const
1326 Q_D(
const QFileInfo);
1327 if (d->isDefaultConstructed)
1329 if (d->fileEngine ==
nullptr) {
1330 if (d->fileEntry.isRoot()) {
1331#if defined(Q_OS_WIN)
1334 if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::ExistsAttribute))
1335 QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::ExistsAttribute);
1336 return d->metaData.exists();
1343 return d->getFileFlags(QAbstractFileEngine::RootFlag);
1439uint QFileInfo::ownerId()
const
1441 Q_D(
const QFileInfo);
1442 return d->checkAttribute(uint(-2),
1443 QFileSystemMetaData::UserId,
1444 [d]() {
return d->metaData.userId(); },
1445 [d]() {
return d->fileEngine->ownerId(QAbstractFileEngine::OwnerUser); });
1478uint QFileInfo::groupId()
const
1480 Q_D(
const QFileInfo);
1481 return d->checkAttribute(uint(-2),
1482 QFileSystemMetaData::GroupId,
1483 [d]() {
return d->metaData.groupId(); },
1484 [d]() {
return d->fileEngine->ownerId(QAbstractFileEngine::OwnerGroup); });
1505bool QFileInfo::permission(QFile::Permissions permissions)
const
1507 Q_D(
const QFileInfo);
1509 auto fseFlags = QFileSystemMetaData::MetaDataFlags::fromInt(permissions.toInt());
1510 auto feFlags = QAbstractFileEngine::FileFlags::fromInt(permissions.toInt());
1511 return d->checkAttribute<
bool>(
1513 [=]() {
return (d->metaData.permissions() & permissions) == permissions; },
1515 return d->getFileFlags(feFlags) == uint(permissions.toInt());
1528QFile::Permissions QFileInfo::permissions()
const
1530 Q_D(
const QFileInfo);
1531 return d->checkAttribute<QFile::Permissions>(
1532 QFileSystemMetaData::Permissions,
1533 [d]() {
return d->metaData.permissions(); },
1535 return QFile::Permissions(d->getFileFlags(QAbstractFileEngine::PermsMask) & QAbstractFileEngine::PermsMask);
1548qint64 QFileInfo::size()
const
1550 Q_D(
const QFileInfo);
1551 return d->checkAttribute<qint64>(
1552 QFileSystemMetaData::SizeAttribute,
1553 [d]() {
return d->metaData.size(); },
1555 if (!d->getCachedFlag(QFileInfoPrivate::CachedSize)) {
1556 d->setCachedFlag(QFileInfoPrivate::CachedSize);
1557 d->fileSize = d->fileEngine->size();
1736QDateTime QFileInfo::fileTime(QFile::FileTime time,
const QTimeZone &tz)
const
1738 Q_D(
const QFileInfo);
1739 QFileSystemMetaData::MetaDataFlags flag;
1741 case QFile::FileAccessTime:
1742 flag = QFileSystemMetaData::AccessTime;
1744 case QFile::FileBirthTime:
1745 flag = QFileSystemMetaData::BirthTime;
1747 case QFile::FileMetadataChangeTime:
1748 flag = QFileSystemMetaData::MetadataChangeTime;
1750 case QFile::FileModificationTime:
1751 flag = QFileSystemMetaData::ModificationTime;
1755 auto fsLambda = [d, time]() {
return d->metaData.fileTime(time); };
1756 auto engineLambda = [d, time]() {
return d->getFileTime(time); };
1758 d->checkAttribute<QDateTime>(flag, std::move(fsLambda), std::move(engineLambda));
1759 return dt.toTimeZone(tz);