17QString QFileInfoPrivate::getFileName(QAbstractFileEngine::FileName name)
const
19 if (cache_enabled && !fileNames[(
int)name].isNull())
20 return fileNames[(
int)name];
23 if (fileEngine ==
nullptr) {
25 case QAbstractFileEngine::CanonicalName:
26 case QAbstractFileEngine::CanonicalPathName: {
27 QFileSystemEntry entry = QFileSystemEngine::canonicalName(fileEntry, metaData);
29 fileNames[QAbstractFileEngine::CanonicalName] = entry.filePath();
30 fileNames[QAbstractFileEngine::CanonicalPathName] = entry.path();
32 if (name == QAbstractFileEngine::CanonicalName)
33 ret = entry.filePath();
38 case QAbstractFileEngine::AbsoluteLinkTarget:
39 ret = QFileSystemEngine::getLinkTarget(fileEntry, metaData).filePath();
41 case QAbstractFileEngine::RawLinkPath:
42 ret = QFileSystemEngine::getRawLinkPath(fileEntry, metaData).filePath();
44 case QAbstractFileEngine::JunctionName:
45 ret = QFileSystemEngine::getJunctionTarget(fileEntry, metaData).filePath();
47 case QAbstractFileEngine::BundleName:
48 ret = QFileSystemEngine::bundleName(fileEntry);
50 case QAbstractFileEngine::AbsoluteName:
51 case QAbstractFileEngine::AbsolutePathName: {
52 QFileSystemEntry entry = QFileSystemEngine::absoluteName(fileEntry);
54 fileNames[QAbstractFileEngine::AbsoluteName] = entry.filePath();
55 fileNames[QAbstractFileEngine::AbsolutePathName] = entry.path();
57 if (name == QAbstractFileEngine::AbsoluteName)
58 ret = entry.filePath();
66 ret = fileEngine->fileName(name);
71 fileNames[(
int)name] = ret;
77 if (cache_enabled && !fileOwners[(
int)own].isNull())
78 return fileOwners[(
int)own];
80 if (fileEngine ==
nullptr) {
82 case QAbstractFileEngine::OwnerUser:
83 ret = QFileSystemEngine::resolveUserName(fileEntry, metaData);
85 case QAbstractFileEngine::OwnerGroup:
86 ret = QFileSystemEngine::resolveGroupName(fileEntry, metaData);
90 ret = fileEngine->owner(own);
95 fileOwners[(
int)own] = ret;
101 Q_ASSERT(fileEngine);
111 QAbstractFileEngine::FileFlags req;
112 uint cachedFlags = 0;
114 if (request & (QAbstractFileEngine::FlagsMask | QAbstractFileEngine::TypesMask)) {
115 if (!getCachedFlag(CachedFileFlags)) {
116 req |= QAbstractFileEngine::FlagsMask;
117 req |= QAbstractFileEngine::TypesMask;
118 req &= (~QAbstractFileEngine::LinkType);
119 req &= (~QAbstractFileEngine::BundleType);
124 if (request & QAbstractFileEngine::LinkType) {
125 if (!getCachedFlag(CachedLinkTypeFlag)) {
126 req |= QAbstractFileEngine::LinkType;
131 if (request & QAbstractFileEngine::BundleType) {
132 if (!getCachedFlag(CachedBundleTypeFlag)) {
133 req |= QAbstractFileEngine::BundleType;
139 if (request & QAbstractFileEngine::PermsMask) {
140 if (!getCachedFlag(CachedPerms)) {
141 req |= QAbstractFileEngine::PermsMask;
148 req &= (~QAbstractFileEngine::Refresh);
150 req |= QAbstractFileEngine::Refresh;
152 QAbstractFileEngine::FileFlags flags = fileEngine->fileFlags(req);
153 fileFlags |= uint(flags.toInt());
154 setCachedFlag(cachedFlags);
157 return fileFlags & request.toInt();
452 if (rhs.d_ptr == lhs.d_ptr)
454 if (lhs.d_ptr->isDefaultConstructed || rhs.d_ptr->isDefaultConstructed)
458 if (lhs.d_ptr->fileEntry.filePath() == rhs.d_ptr->fileEntry.filePath())
461 Qt::CaseSensitivity sensitive;
462 if (lhs.d_ptr->fileEngine ==
nullptr || rhs.d_ptr->fileEngine ==
nullptr) {
463 if (lhs.d_ptr->fileEngine != rhs.d_ptr->fileEngine)
466 const bool lhsCaseSensitive = QFileSystemEngine::isCaseSensitive(lhs.d_ptr->fileEntry, lhs.d_ptr->metaData);
467 if (lhsCaseSensitive != QFileSystemEngine::isCaseSensitive(rhs.d_ptr->fileEntry, rhs.d_ptr->metaData))
470 sensitive = lhsCaseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive;
472 if (lhs.d_ptr->fileEngine->caseSensitive() != rhs.d_ptr->fileEngine->caseSensitive())
474 sensitive = lhs.d_ptr->fileEngine->caseSensitive() ? Qt::CaseSensitive : Qt::CaseInsensitive;
478 return lhs.canonicalFilePath().compare(rhs.canonicalFilePath(), sensitive) == 0;
720bool QFileInfo::exists()
const
722 Q_D(
const QFileInfo);
723 if (d->isDefaultConstructed)
725 if (d->fileEngine ==
nullptr) {
726 if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::ExistsAttribute))
727 QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::ExistsAttribute);
728 return d->metaData.exists();
730 return d->getFileFlags(QAbstractFileEngine::ExistsFlag);
745bool QFileInfo::exists(
const QString &path)
749 QFileSystemEntry entry(path);
750 QFileSystemMetaData data;
752 if (
auto engine = QFileSystemEngine::createLegacyEngine(entry, data))
753 return QFileInfo(
new QFileInfoPrivate(entry, data, std::move(engine))).exists();
755 QFileSystemEngine::fillMetaData(entry, data, QFileSystemMetaData::ExistsAttribute);
756 return data.exists();
865QString QFileInfo::completeBaseName()
const
867 Q_D(
const QFileInfo);
868 if (d->isDefaultConstructed)
871 return d->fileEntry.completeBaseName();
872 const QString fileEngineBaseName = d->fileEngine->fileName(QAbstractFileEngine::BaseName);
873 return QFileSystemEntry(fileEngineBaseName).completeBaseName();
1008bool QFileInfo::isExecutable()
const
1010 Q_D(
const QFileInfo);
1011 return d->checkAttribute<
bool>(
1012 QFileSystemMetaData::UserExecutePermission,
1013 [d]() {
return d->metaData.isExecutable(); },
1014 [d]() {
return d->getFileFlags(QAbstractFileEngine::ExeUserPerm); });
1205bool QFileInfo::isOther()
const
1207 Q_D(
const QFileInfo);
1208 using M = QFileSystemMetaData::MetaDataFlag;
1211 constexpr auto mdFlags = M::ExistsAttribute | M::DirectoryType | M::FileType | M::WinLnkType;
1213 auto fsLambda = [d]() {
1216 if (d->metaData.isLnkFile())
1218 return d->metaData.exists() && !d->metaData.isDirectory() && !d->metaData.isFile();
1221 auto engineLambda = [d]() {
1222 using F = QAbstractFileEngine::FileFlag;
1223 return d->getFileFlags(F::ExistsFlag)
1224 && !d->getFileFlags(F::LinkType)
1225 && !d->getFileFlags(F::DirectoryType)
1226 && !d->getFileFlags(F::FileType);
1229 return d->checkAttribute<
bool>(mdFlags, std::move(fsLambda), std::move(engineLambda));
1307bool QFileInfo::isRoot()
const
1309 Q_D(
const QFileInfo);
1310 if (d->isDefaultConstructed)
1312 if (d->fileEngine ==
nullptr) {
1313 if (d->fileEntry.isRoot()) {
1314#if defined(Q_OS_WIN)
1317 if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::ExistsAttribute))
1318 QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::ExistsAttribute);
1319 return d->metaData.exists();
1326 return d->getFileFlags(QAbstractFileEngine::RootFlag);
1422uint QFileInfo::ownerId()
const
1424 Q_D(
const QFileInfo);
1425 return d->checkAttribute(uint(-2),
1426 QFileSystemMetaData::UserId,
1427 [d]() {
return d->metaData.userId(); },
1428 [d]() {
return d->fileEngine->ownerId(QAbstractFileEngine::OwnerUser); });
1461uint QFileInfo::groupId()
const
1463 Q_D(
const QFileInfo);
1464 return d->checkAttribute(uint(-2),
1465 QFileSystemMetaData::GroupId,
1466 [d]() {
return d->metaData.groupId(); },
1467 [d]() {
return d->fileEngine->ownerId(QAbstractFileEngine::OwnerGroup); });
1488bool QFileInfo::permission(QFile::Permissions permissions)
const
1490 Q_D(
const QFileInfo);
1492 auto fseFlags = QFileSystemMetaData::MetaDataFlags::fromInt(permissions.toInt());
1493 auto feFlags = QAbstractFileEngine::FileFlags::fromInt(permissions.toInt());
1494 return d->checkAttribute<
bool>(
1496 [=]() {
return (d->metaData.permissions() & permissions) == permissions; },
1498 return d->getFileFlags(feFlags) == uint(permissions.toInt());
1511QFile::Permissions QFileInfo::permissions()
const
1513 Q_D(
const QFileInfo);
1514 return d->checkAttribute<QFile::Permissions>(
1515 QFileSystemMetaData::Permissions,
1516 [d]() {
return d->metaData.permissions(); },
1518 return QFile::Permissions(d->getFileFlags(QAbstractFileEngine::PermsMask) & QAbstractFileEngine::PermsMask);
1531qint64 QFileInfo::size()
const
1533 Q_D(
const QFileInfo);
1534 return d->checkAttribute<qint64>(
1535 QFileSystemMetaData::SizeAttribute,
1536 [d]() {
return d->metaData.size(); },
1538 if (!d->getCachedFlag(QFileInfoPrivate::CachedSize)) {
1539 d->setCachedFlag(QFileInfoPrivate::CachedSize);
1540 d->fileSize = d->fileEngine->size();
1719QDateTime QFileInfo::fileTime(QFile::FileTime time,
const QTimeZone &tz)
const
1721 Q_D(
const QFileInfo);
1722 QFileSystemMetaData::MetaDataFlags flag;
1724 case QFile::FileAccessTime:
1725 flag = QFileSystemMetaData::AccessTime;
1727 case QFile::FileBirthTime:
1728 flag = QFileSystemMetaData::BirthTime;
1730 case QFile::FileMetadataChangeTime:
1731 flag = QFileSystemMetaData::MetadataChangeTime;
1733 case QFile::FileModificationTime:
1734 flag = QFileSystemMetaData::ModificationTime;
1738 auto fsLambda = [d, time]() {
return d->metaData.fileTime(time); };
1739 auto engineLambda = [d, time]() {
return d->getFileTime(time); };
1741 d->checkAttribute<QDateTime>(flag, std::move(fsLambda), std::move(engineLambda));
1742 return dt.toTimeZone(tz);