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;
742bool QFileInfo::exists()
const
744 Q_D(
const QFileInfo);
745 if (d->isDefaultConstructed)
747 if (d->fileEngine ==
nullptr) {
748 if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::ExistsAttribute))
749 QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::ExistsAttribute);
750 return d->metaData.exists();
752 return d->getFileFlags(QAbstractFileEngine::ExistsFlag);
767bool QFileInfo::exists(
const QString &path)
771 QFileSystemEntry entry(path);
772 QFileSystemMetaData data;
774 if (
auto engine = QFileSystemEngine::createLegacyEngine(entry, data))
775 return QFileInfo(
new QFileInfoPrivate(entry, data, std::move(engine))).exists();
777 QFileSystemEngine::fillMetaData(entry, data, QFileSystemMetaData::ExistsAttribute);
778 return data.exists();
887QString QFileInfo::completeBaseName()
const
889 Q_D(
const QFileInfo);
890 if (d->isDefaultConstructed)
893 return d->fileEntry.completeBaseName();
894 const QString fileEngineBaseName = d->fileEngine->fileName(QAbstractFileEngine::BaseName);
895 return QFileSystemEntry(fileEngineBaseName).completeBaseName();
1030bool QFileInfo::isExecutable()
const
1032 Q_D(
const QFileInfo);
1033 return d->checkAttribute<
bool>(
1034 QFileSystemMetaData::UserExecutePermission,
1035 [d]() {
return d->metaData.isExecutable(); },
1036 [d]() {
return d->getFileFlags(QAbstractFileEngine::ExeUserPerm); });
1227bool QFileInfo::isOther()
const
1229 Q_D(
const QFileInfo);
1230 using M = QFileSystemMetaData::MetaDataFlag;
1233 constexpr auto mdFlags = M::ExistsAttribute | M::DirectoryType | M::FileType | M::WinLnkType;
1235 auto fsLambda = [d]() {
1238 if (d->metaData.isLnkFile())
1240 return d->metaData.exists() && !d->metaData.isDirectory() && !d->metaData.isFile();
1243 auto engineLambda = [d]() {
1244 using F = QAbstractFileEngine::FileFlag;
1245 return d->getFileFlags(F::ExistsFlag)
1246 && !d->getFileFlags(F::LinkType)
1247 && !d->getFileFlags(F::DirectoryType)
1248 && !d->getFileFlags(F::FileType);
1251 return d->checkAttribute<
bool>(mdFlags, std::move(fsLambda), std::move(engineLambda));
1329bool QFileInfo::isRoot()
const
1331 Q_D(
const QFileInfo);
1332 if (d->isDefaultConstructed)
1334 if (d->fileEngine ==
nullptr) {
1335 if (d->fileEntry.isRoot()) {
1336#if defined(Q_OS_WIN)
1339 if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::ExistsAttribute))
1340 QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::ExistsAttribute);
1341 return d->metaData.exists();
1348 return d->getFileFlags(QAbstractFileEngine::RootFlag);
1444uint QFileInfo::ownerId()
const
1446 Q_D(
const QFileInfo);
1447 return d->checkAttribute(uint(-2),
1448 QFileSystemMetaData::UserId,
1449 [d]() {
return d->metaData.userId(); },
1450 [d]() {
return d->fileEngine->ownerId(QAbstractFileEngine::OwnerUser); });
1483uint QFileInfo::groupId()
const
1485 Q_D(
const QFileInfo);
1486 return d->checkAttribute(uint(-2),
1487 QFileSystemMetaData::GroupId,
1488 [d]() {
return d->metaData.groupId(); },
1489 [d]() {
return d->fileEngine->ownerId(QAbstractFileEngine::OwnerGroup); });
1510bool QFileInfo::permission(QFile::Permissions permissions)
const
1512 Q_D(
const QFileInfo);
1514 auto fseFlags = QFileSystemMetaData::MetaDataFlags::fromInt(permissions.toInt());
1515 auto feFlags = QAbstractFileEngine::FileFlags::fromInt(permissions.toInt());
1516 return d->checkAttribute<
bool>(
1518 [=]() {
return (d->metaData.permissions() & permissions) == permissions; },
1520 return d->getFileFlags(feFlags) == uint(permissions.toInt());
1533QFile::Permissions QFileInfo::permissions()
const
1535 Q_D(
const QFileInfo);
1536 return d->checkAttribute<QFile::Permissions>(
1537 QFileSystemMetaData::Permissions,
1538 [d]() {
return d->metaData.permissions(); },
1540 return QFile::Permissions(d->getFileFlags(QAbstractFileEngine::PermsMask) & QAbstractFileEngine::PermsMask);
1553qint64 QFileInfo::size()
const
1555 Q_D(
const QFileInfo);
1556 return d->checkAttribute<qint64>(
1557 QFileSystemMetaData::SizeAttribute,
1558 [d]() {
return d->metaData.size(); },
1560 if (!d->getCachedFlag(QFileInfoPrivate::CachedSize)) {
1561 d->setCachedFlag(QFileInfoPrivate::CachedSize);
1562 d->fileSize = d->fileEngine->size();
1741QDateTime QFileInfo::fileTime(QFile::FileTime time,
const QTimeZone &tz)
const
1743 Q_D(
const QFileInfo);
1744 QFileSystemMetaData::MetaDataFlags flag;
1746 case QFile::FileAccessTime:
1747 flag = QFileSystemMetaData::AccessTime;
1749 case QFile::FileBirthTime:
1750 flag = QFileSystemMetaData::BirthTime;
1752 case QFile::FileMetadataChangeTime:
1753 flag = QFileSystemMetaData::MetadataChangeTime;
1755 case QFile::FileModificationTime:
1756 flag = QFileSystemMetaData::ModificationTime;
1760 auto fsLambda = [d, time]() {
return d->metaData.fileTime(time); };
1761 auto engineLambda = [d, time]() {
return d->getFileTime(time); };
1763 d->checkAttribute<QDateTime>(flag, std::move(fsLambda), std::move(engineLambda));
1764 return dt.toTimeZone(tz);