18QString QFileInfoPrivate::getFileName(QAbstractFileEngine::FileName name)
const
20 if (cache_enabled && !fileNames[(
int)name].isNull())
21 return fileNames[(
int)name];
24 if (fileEngine ==
nullptr) {
26 case QAbstractFileEngine::CanonicalName:
27 case QAbstractFileEngine::CanonicalPathName: {
28 QFileSystemEntry entry = QFileSystemEngine::canonicalName(fileEntry, metaData);
30 fileNames[QAbstractFileEngine::CanonicalName] = entry.filePath();
31 fileNames[QAbstractFileEngine::CanonicalPathName] = entry.path();
33 if (name == QAbstractFileEngine::CanonicalName)
34 ret = entry.filePath();
39 case QAbstractFileEngine::AbsoluteLinkTarget:
40 ret = QFileSystemEngine::getLinkTarget(fileEntry, metaData).filePath();
42 case QAbstractFileEngine::RawLinkPath:
43 ret = QFileSystemEngine::getRawLinkPath(fileEntry, metaData).filePath();
45 case QAbstractFileEngine::JunctionName:
46 ret = QFileSystemEngine::getJunctionTarget(fileEntry, metaData).filePath();
48 case QAbstractFileEngine::BundleName:
49 ret = QFileSystemEngine::bundleName(fileEntry);
51 case QAbstractFileEngine::AbsoluteName:
52 case QAbstractFileEngine::AbsolutePathName: {
53 QFileSystemEntry entry = QFileSystemEngine::absoluteName(fileEntry);
55 fileNames[QAbstractFileEngine::AbsoluteName] = entry.filePath();
56 fileNames[QAbstractFileEngine::AbsolutePathName] = entry.path();
58 if (name == QAbstractFileEngine::AbsoluteName)
59 ret = entry.filePath();
67 ret = fileEngine->fileName(name);
72 fileNames[(
int)name] = ret;
78 if (cache_enabled && !fileOwners[(
int)own].isNull())
79 return fileOwners[(
int)own];
81 if (fileEngine ==
nullptr) {
83 case QAbstractFileEngine::OwnerUser:
84 ret = QFileSystemEngine::resolveUserName(fileEntry, metaData);
86 case QAbstractFileEngine::OwnerGroup:
87 ret = QFileSystemEngine::resolveGroupName(fileEntry, metaData);
91 ret = fileEngine->owner(own);
96 fileOwners[(
int)own] = ret;
102 Q_ASSERT(fileEngine);
112 QAbstractFileEngine::FileFlags req;
113 uint cachedFlags = 0;
115 if (request & (QAbstractFileEngine::FlagsMask | QAbstractFileEngine::TypesMask)) {
116 if (!getCachedFlag(CachedFileFlags)) {
117 req |= QAbstractFileEngine::FlagsMask;
118 req |= QAbstractFileEngine::TypesMask;
119 req &= (~QAbstractFileEngine::LinkType);
120 req &= (~QAbstractFileEngine::BundleType);
125 if (request & QAbstractFileEngine::LinkType) {
126 if (!getCachedFlag(CachedLinkTypeFlag)) {
127 req |= QAbstractFileEngine::LinkType;
132 if (request & QAbstractFileEngine::BundleType) {
133 if (!getCachedFlag(CachedBundleTypeFlag)) {
134 req |= QAbstractFileEngine::BundleType;
140 if (request & QAbstractFileEngine::PermsMask) {
141 if (!getCachedFlag(CachedPerms)) {
142 req |= QAbstractFileEngine::PermsMask;
149 req &= (~QAbstractFileEngine::Refresh);
151 req |= QAbstractFileEngine::Refresh;
153 QAbstractFileEngine::FileFlags flags = fileEngine->fileFlags(req);
154 fileFlags |= uint(flags.toInt());
155 setCachedFlag(cachedFlags);
158 return fileFlags & request.toInt();
453 if (rhs.d_ptr == lhs.d_ptr)
455 if (lhs.d_ptr->isDefaultConstructed || rhs.d_ptr->isDefaultConstructed)
459 if (lhs.d_ptr->fileEntry.filePath() == rhs.d_ptr->fileEntry.filePath())
462 Qt::CaseSensitivity sensitive;
463 if (lhs.d_ptr->fileEngine ==
nullptr || rhs.d_ptr->fileEngine ==
nullptr) {
464 if (lhs.d_ptr->fileEngine != rhs.d_ptr->fileEngine)
467 const bool lhsCaseSensitive = QFileSystemEngine::isCaseSensitive(lhs.d_ptr->fileEntry, lhs.d_ptr->metaData);
468 if (lhsCaseSensitive != QFileSystemEngine::isCaseSensitive(rhs.d_ptr->fileEntry, rhs.d_ptr->metaData))
471 sensitive = lhsCaseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive;
473 if (lhs.d_ptr->fileEngine->caseSensitive() != rhs.d_ptr->fileEngine->caseSensitive())
475 sensitive = lhs.d_ptr->fileEngine->caseSensitive() ? Qt::CaseSensitive : Qt::CaseInsensitive;
479 return lhs.canonicalFilePath().compare(rhs.canonicalFilePath(), sensitive) == 0;
721bool QFileInfo::exists()
const
723 Q_D(
const QFileInfo);
724 if (d->isDefaultConstructed)
726 if (d->fileEngine ==
nullptr) {
727 if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::ExistsAttribute))
728 QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::ExistsAttribute);
729 return d->metaData.exists();
731 return d->getFileFlags(QAbstractFileEngine::ExistsFlag);
746bool QFileInfo::exists(
const QString &path)
750 QFileSystemEntry entry(path);
751 QFileSystemMetaData data;
753 if (
auto engine = QFileSystemEngine::createLegacyEngine(entry, data))
754 return QFileInfo(
new QFileInfoPrivate(entry, data, std::move(engine))).exists();
756 QFileSystemEngine::fillMetaData(entry, data, QFileSystemMetaData::ExistsAttribute);
757 return data.exists();
866QString QFileInfo::completeBaseName()
const
868 Q_D(
const QFileInfo);
869 if (d->isDefaultConstructed)
872 return d->fileEntry.completeBaseName();
873 const QString fileEngineBaseName = d->fileEngine->fileName(QAbstractFileEngine::BaseName);
874 return QFileSystemEntry(fileEngineBaseName).completeBaseName();
1009bool QFileInfo::isExecutable()
const
1011 Q_D(
const QFileInfo);
1012 return d->checkAttribute<
bool>(
1013 QFileSystemMetaData::UserExecutePermission,
1014 [d]() {
return d->metaData.isExecutable(); },
1015 [d]() {
return d->getFileFlags(QAbstractFileEngine::ExeUserPerm); });
1206bool QFileInfo::isOther()
const
1208 Q_D(
const QFileInfo);
1209 using M = QFileSystemMetaData::MetaDataFlag;
1212 constexpr auto mdFlags = M::ExistsAttribute | M::DirectoryType | M::FileType | M::WinLnkType;
1214 auto fsLambda = [d]() {
1217 if (d->metaData.isLnkFile())
1219 return d->metaData.exists() && !d->metaData.isDirectory() && !d->metaData.isFile();
1222 auto engineLambda = [d]() {
1223 using F = QAbstractFileEngine::FileFlag;
1224 return d->getFileFlags(F::ExistsFlag)
1225 && !d->getFileFlags(F::LinkType)
1226 && !d->getFileFlags(F::DirectoryType)
1227 && !d->getFileFlags(F::FileType);
1230 return d->checkAttribute<
bool>(mdFlags, std::move(fsLambda), std::move(engineLambda));
1308bool QFileInfo::isRoot()
const
1310 Q_D(
const QFileInfo);
1311 if (d->isDefaultConstructed)
1313 if (d->fileEngine ==
nullptr) {
1314 if (d->fileEntry.isRoot()) {
1315#if defined(Q_OS_WIN)
1318 if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::ExistsAttribute))
1319 QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::ExistsAttribute);
1320 return d->metaData.exists();
1327 return d->getFileFlags(QAbstractFileEngine::RootFlag);
1423uint QFileInfo::ownerId()
const
1425 Q_D(
const QFileInfo);
1426 return d->checkAttribute(uint(-2),
1427 QFileSystemMetaData::UserId,
1428 [d]() {
return d->metaData.userId(); },
1429 [d]() {
return d->fileEngine->ownerId(QAbstractFileEngine::OwnerUser); });
1462uint QFileInfo::groupId()
const
1464 Q_D(
const QFileInfo);
1465 return d->checkAttribute(uint(-2),
1466 QFileSystemMetaData::GroupId,
1467 [d]() {
return d->metaData.groupId(); },
1468 [d]() {
return d->fileEngine->ownerId(QAbstractFileEngine::OwnerGroup); });
1489bool QFileInfo::permission(QFile::Permissions permissions)
const
1491 Q_D(
const QFileInfo);
1493 auto fseFlags = QFileSystemMetaData::MetaDataFlags::fromInt(permissions.toInt());
1494 auto feFlags = QAbstractFileEngine::FileFlags::fromInt(permissions.toInt());
1495 return d->checkAttribute<
bool>(
1497 [=]() {
return (d->metaData.permissions() & permissions) == permissions; },
1499 return d->getFileFlags(feFlags) == uint(permissions.toInt());
1512QFile::Permissions QFileInfo::permissions()
const
1514 Q_D(
const QFileInfo);
1515 return d->checkAttribute<QFile::Permissions>(
1516 QFileSystemMetaData::Permissions,
1517 [d]() {
return d->metaData.permissions(); },
1519 return QFile::Permissions(d->getFileFlags(QAbstractFileEngine::PermsMask) & QAbstractFileEngine::PermsMask);
1532qint64 QFileInfo::size()
const
1534 Q_D(
const QFileInfo);
1535 return d->checkAttribute<qint64>(
1536 QFileSystemMetaData::SizeAttribute,
1537 [d]() {
return d->metaData.size(); },
1539 if (!d->getCachedFlag(QFileInfoPrivate::CachedSize)) {
1540 d->setCachedFlag(QFileInfoPrivate::CachedSize);
1541 d->fileSize = d->fileEngine->size();
1720QDateTime QFileInfo::fileTime(QFile::FileTime time,
const QTimeZone &tz)
const
1722 Q_D(
const QFileInfo);
1723 QFileSystemMetaData::MetaDataFlags flag;
1725 case QFile::FileAccessTime:
1726 flag = QFileSystemMetaData::AccessTime;
1728 case QFile::FileBirthTime:
1729 flag = QFileSystemMetaData::BirthTime;
1731 case QFile::FileMetadataChangeTime:
1732 flag = QFileSystemMetaData::MetadataChangeTime;
1734 case QFile::FileModificationTime:
1735 flag = QFileSystemMetaData::ModificationTime;
1739 auto fsLambda = [d, time]() {
return d->metaData.fileTime(time); };
1740 auto engineLambda = [d, time]() {
return d->getFileTime(time); };
1742 d->checkAttribute<QDateTime>(flag, std::move(fsLambda), std::move(engineLambda));
1743 return dt.toTimeZone(tz);