QFileInfo: harmonize QFileInfo() and QFileInfo("")
If a QFileInfo was constructed with an empty path, which could happen with QFileInfo(QFile()) or via QDir, etc., then it would issue system calls to empty paths and could even produce warnings. This commit makes am empty path name be the same as a default-constructed QFileInfo and corrects the use if 0 for ownerId and groupId to match the documentation. [ChangeLog][Important Behavior Changes] QFileInfo on empty strings now behaves like the default-constructed QFileInfo. Notably, path() will now be the empty string too, instead of ".", which means absoluteFilePath() is no longer the current working directory. Change-Id: I8d96dea9955d4c749b99fffd14ce34968b1d9bbf Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
This commit is contained in:
parent
d3393ce258
commit
6504bc6bbc
@ -591,9 +591,6 @@ QString QFileInfo::absolutePath() const
|
|||||||
|
|
||||||
if (d->isDefaultConstructed) {
|
if (d->isDefaultConstructed) {
|
||||||
return QLatin1String("");
|
return QLatin1String("");
|
||||||
} else if (d->fileEntry.isEmpty()) {
|
|
||||||
qWarning("QFileInfo::absolutePath: Constructed with empty filename");
|
|
||||||
return QLatin1String("");
|
|
||||||
}
|
}
|
||||||
return d->getFileName(QAbstractFileEngine::AbsolutePathName);
|
return d->getFileName(QAbstractFileEngine::AbsolutePathName);
|
||||||
}
|
}
|
||||||
@ -913,14 +910,10 @@ QDir QFileInfo::absoluteDir() const
|
|||||||
bool QFileInfo::isReadable() const
|
bool QFileInfo::isReadable() const
|
||||||
{
|
{
|
||||||
Q_D(const QFileInfo);
|
Q_D(const QFileInfo);
|
||||||
if (d->isDefaultConstructed)
|
return d->checkAttribute<bool>(
|
||||||
return false;
|
QFileSystemMetaData::UserReadPermission,
|
||||||
if (d->fileEngine == 0) {
|
[d]() { return (d->metaData.permissions() & QFile::ReadUser) != 0; },
|
||||||
if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::UserReadPermission))
|
[d]() { return d->getFileFlags(QAbstractFileEngine::ReadUserPerm); });
|
||||||
QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::UserReadPermission);
|
|
||||||
return (d->metaData.permissions() & QFile::ReadUser) != 0;
|
|
||||||
}
|
|
||||||
return d->getFileFlags(QAbstractFileEngine::ReadUserPerm);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -934,14 +927,10 @@ bool QFileInfo::isReadable() const
|
|||||||
bool QFileInfo::isWritable() const
|
bool QFileInfo::isWritable() const
|
||||||
{
|
{
|
||||||
Q_D(const QFileInfo);
|
Q_D(const QFileInfo);
|
||||||
if (d->isDefaultConstructed)
|
return d->checkAttribute<bool>(
|
||||||
return false;
|
QFileSystemMetaData::UserWritePermission,
|
||||||
if (d->fileEngine == 0) {
|
[d]() { return (d->metaData.permissions() & QFile::WriteUser) != 0; },
|
||||||
if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::UserWritePermission))
|
[d]() { return d->getFileFlags(QAbstractFileEngine::WriteUserPerm); });
|
||||||
QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::UserWritePermission);
|
|
||||||
return (d->metaData.permissions() & QFile::WriteUser) != 0;
|
|
||||||
}
|
|
||||||
return d->getFileFlags(QAbstractFileEngine::WriteUserPerm);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -952,14 +941,10 @@ bool QFileInfo::isWritable() const
|
|||||||
bool QFileInfo::isExecutable() const
|
bool QFileInfo::isExecutable() const
|
||||||
{
|
{
|
||||||
Q_D(const QFileInfo);
|
Q_D(const QFileInfo);
|
||||||
if (d->isDefaultConstructed)
|
return d->checkAttribute<bool>(
|
||||||
return false;
|
QFileSystemMetaData::UserExecutePermission,
|
||||||
if (d->fileEngine == 0) {
|
[d]() { return (d->metaData.permissions() & QFile::ExeUser) != 0; },
|
||||||
if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::UserExecutePermission))
|
[d]() { return d->getFileFlags(QAbstractFileEngine::ExeUserPerm); });
|
||||||
QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::UserExecutePermission);
|
|
||||||
return (d->metaData.permissions() & QFile::ExeUser) != 0;
|
|
||||||
}
|
|
||||||
return d->getFileFlags(QAbstractFileEngine::ExeUserPerm);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -971,14 +956,10 @@ bool QFileInfo::isExecutable() const
|
|||||||
bool QFileInfo::isHidden() const
|
bool QFileInfo::isHidden() const
|
||||||
{
|
{
|
||||||
Q_D(const QFileInfo);
|
Q_D(const QFileInfo);
|
||||||
if (d->isDefaultConstructed)
|
return d->checkAttribute<bool>(
|
||||||
return false;
|
QFileSystemMetaData::HiddenAttribute,
|
||||||
if (d->fileEngine == 0) {
|
[d]() { return d->metaData.isHidden(); },
|
||||||
if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::HiddenAttribute))
|
[d]() { return d->getFileFlags(QAbstractFileEngine::HiddenFlag); });
|
||||||
QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::HiddenAttribute);
|
|
||||||
return d->metaData.isHidden();
|
|
||||||
}
|
|
||||||
return d->getFileFlags(QAbstractFileEngine::HiddenFlag);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -1014,14 +995,10 @@ bool QFileInfo::isNativePath() const
|
|||||||
bool QFileInfo::isFile() const
|
bool QFileInfo::isFile() const
|
||||||
{
|
{
|
||||||
Q_D(const QFileInfo);
|
Q_D(const QFileInfo);
|
||||||
if (d->isDefaultConstructed)
|
return d->checkAttribute<bool>(
|
||||||
return false;
|
QFileSystemMetaData::FileType,
|
||||||
if (d->fileEngine == 0) {
|
[d]() { return d->metaData.isFile(); },
|
||||||
if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::FileType))
|
[d]() { return d->getFileFlags(QAbstractFileEngine::FileType); });
|
||||||
QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::FileType);
|
|
||||||
return d->metaData.isFile();
|
|
||||||
}
|
|
||||||
return d->getFileFlags(QAbstractFileEngine::FileType);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -1033,14 +1010,10 @@ bool QFileInfo::isFile() const
|
|||||||
bool QFileInfo::isDir() const
|
bool QFileInfo::isDir() const
|
||||||
{
|
{
|
||||||
Q_D(const QFileInfo);
|
Q_D(const QFileInfo);
|
||||||
if (d->isDefaultConstructed)
|
return d->checkAttribute<bool>(
|
||||||
return false;
|
QFileSystemMetaData::DirectoryType,
|
||||||
if (d->fileEngine == 0) {
|
[d]() { return d->metaData.isDirectory(); },
|
||||||
if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::DirectoryType))
|
[d]() { return d->getFileFlags(QAbstractFileEngine::DirectoryType); });
|
||||||
QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::DirectoryType);
|
|
||||||
return d->metaData.isDirectory();
|
|
||||||
}
|
|
||||||
return d->getFileFlags(QAbstractFileEngine::DirectoryType);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1054,14 +1027,10 @@ bool QFileInfo::isDir() const
|
|||||||
bool QFileInfo::isBundle() const
|
bool QFileInfo::isBundle() const
|
||||||
{
|
{
|
||||||
Q_D(const QFileInfo);
|
Q_D(const QFileInfo);
|
||||||
if (d->isDefaultConstructed)
|
return d->checkAttribute<bool>(
|
||||||
return false;
|
QFileSystemMetaData::BundleType,
|
||||||
if (d->fileEngine == 0) {
|
[d]() { return d->metaData.isBundle(); },
|
||||||
if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::BundleType))
|
[d]() { return d->getFileFlags(QAbstractFileEngine::BundleType); });
|
||||||
QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::BundleType);
|
|
||||||
return d->metaData.isBundle();
|
|
||||||
}
|
|
||||||
return d->getFileFlags(QAbstractFileEngine::BundleType);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -1084,14 +1053,10 @@ bool QFileInfo::isBundle() const
|
|||||||
bool QFileInfo::isSymLink() const
|
bool QFileInfo::isSymLink() const
|
||||||
{
|
{
|
||||||
Q_D(const QFileInfo);
|
Q_D(const QFileInfo);
|
||||||
if (d->isDefaultConstructed)
|
return d->checkAttribute<bool>(
|
||||||
return false;
|
QFileSystemMetaData::LegacyLinkType,
|
||||||
if (d->fileEngine == 0) {
|
[d]() { return d->metaData.isLegacyLink(); },
|
||||||
if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::LegacyLinkType))
|
[d]() { return d->getFileFlags(QAbstractFileEngine::LinkType); });
|
||||||
QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::LegacyLinkType);
|
|
||||||
return d->metaData.isLegacyLink();
|
|
||||||
}
|
|
||||||
return d->getFileFlags(QAbstractFileEngine::LinkType);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -1103,7 +1068,7 @@ bool QFileInfo::isRoot() const
|
|||||||
{
|
{
|
||||||
Q_D(const QFileInfo);
|
Q_D(const QFileInfo);
|
||||||
if (d->isDefaultConstructed)
|
if (d->isDefaultConstructed)
|
||||||
return true;
|
return false;
|
||||||
if (d->fileEngine == 0) {
|
if (d->fileEngine == 0) {
|
||||||
if (d->fileEntry.isRoot()) {
|
if (d->fileEntry.isRoot()) {
|
||||||
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
|
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
|
||||||
@ -1179,14 +1144,10 @@ QString QFileInfo::owner() const
|
|||||||
uint QFileInfo::ownerId() const
|
uint QFileInfo::ownerId() const
|
||||||
{
|
{
|
||||||
Q_D(const QFileInfo);
|
Q_D(const QFileInfo);
|
||||||
if (d->isDefaultConstructed)
|
return d->checkAttribute(uint(-2),
|
||||||
return 0;
|
QFileSystemMetaData::UserId,
|
||||||
if (d->fileEngine == 0) {
|
[d]() { return d->metaData.userId(); },
|
||||||
if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::UserId))
|
[d]() { return d->fileEngine->ownerId(QAbstractFileEngine::OwnerUser); });
|
||||||
QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::UserId);
|
|
||||||
return d->metaData.userId();
|
|
||||||
}
|
|
||||||
return d->fileEngine->ownerId(QAbstractFileEngine::OwnerUser);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -1218,14 +1179,10 @@ QString QFileInfo::group() const
|
|||||||
uint QFileInfo::groupId() const
|
uint QFileInfo::groupId() const
|
||||||
{
|
{
|
||||||
Q_D(const QFileInfo);
|
Q_D(const QFileInfo);
|
||||||
if (d->isDefaultConstructed)
|
return d->checkAttribute(uint(-2),
|
||||||
return 0;
|
QFileSystemMetaData::GroupId,
|
||||||
if (d->fileEngine == 0) {
|
[d]() { return d->metaData.groupId(); },
|
||||||
if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::GroupId))
|
[d]() { return d->fileEngine->ownerId(QAbstractFileEngine::OwnerGroup); });
|
||||||
QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::GroupId);
|
|
||||||
return d->metaData.groupId();
|
|
||||||
}
|
|
||||||
return d->fileEngine->ownerId(QAbstractFileEngine::OwnerGroup);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -1247,16 +1204,15 @@ uint QFileInfo::groupId() const
|
|||||||
bool QFileInfo::permission(QFile::Permissions permissions) const
|
bool QFileInfo::permission(QFile::Permissions permissions) const
|
||||||
{
|
{
|
||||||
Q_D(const QFileInfo);
|
Q_D(const QFileInfo);
|
||||||
if (d->isDefaultConstructed)
|
// the QFileSystemMetaData::MetaDataFlag and QFile::Permissions overlap, so just cast.
|
||||||
return false;
|
auto fseFlags = QFileSystemMetaData::MetaDataFlag(int(permissions));
|
||||||
if (d->fileEngine == 0) {
|
auto feFlags = QAbstractFileEngine::FileFlags(int(permissions));
|
||||||
// the QFileSystemMetaData::MetaDataFlag and QFile::Permissions overlap, so just static cast.
|
return d->checkAttribute<bool>(
|
||||||
QFileSystemMetaData::MetaDataFlag permissionFlags = static_cast<QFileSystemMetaData::MetaDataFlag>((int)permissions);
|
fseFlags,
|
||||||
if (!d->cache_enabled || !d->metaData.hasFlags(permissionFlags))
|
[=]() { return (d->metaData.permissions() & permissions) == permissions; },
|
||||||
QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, permissionFlags);
|
[=]() {
|
||||||
return (d->metaData.permissions() & permissions) == permissions;
|
return d->getFileFlags(feFlags) == uint(permissions);
|
||||||
}
|
});
|
||||||
return d->getFileFlags(QAbstractFileEngine::FileFlags((int)permissions)) == (uint)permissions;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -1269,14 +1225,12 @@ bool QFileInfo::permission(QFile::Permissions permissions) const
|
|||||||
QFile::Permissions QFileInfo::permissions() const
|
QFile::Permissions QFileInfo::permissions() const
|
||||||
{
|
{
|
||||||
Q_D(const QFileInfo);
|
Q_D(const QFileInfo);
|
||||||
if (d->isDefaultConstructed)
|
return d->checkAttribute<QFile::Permissions>(
|
||||||
return 0;
|
QFileSystemMetaData::Permissions,
|
||||||
if (d->fileEngine == 0) {
|
[d]() { return d->metaData.permissions(); },
|
||||||
if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::Permissions))
|
[d]() {
|
||||||
QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::Permissions);
|
|
||||||
return d->metaData.permissions();
|
|
||||||
}
|
|
||||||
return QFile::Permissions(d->getFileFlags(QAbstractFileEngine::PermsMask) & QAbstractFileEngine::PermsMask);
|
return QFile::Permissions(d->getFileFlags(QAbstractFileEngine::PermsMask) & QAbstractFileEngine::PermsMask);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1289,18 +1243,16 @@ QFile::Permissions QFileInfo::permissions() const
|
|||||||
qint64 QFileInfo::size() const
|
qint64 QFileInfo::size() const
|
||||||
{
|
{
|
||||||
Q_D(const QFileInfo);
|
Q_D(const QFileInfo);
|
||||||
if (d->isDefaultConstructed)
|
return d->checkAttribute<qint64>(
|
||||||
return 0;
|
QFileSystemMetaData::SizeAttribute,
|
||||||
if (d->fileEngine == 0) {
|
[d]() { return d->metaData.size(); },
|
||||||
if (!d->cache_enabled || !d->metaData.hasFlags(QFileSystemMetaData::SizeAttribute))
|
[d]() {
|
||||||
QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, QFileSystemMetaData::SizeAttribute);
|
|
||||||
return d->metaData.size();
|
|
||||||
}
|
|
||||||
if (!d->getCachedFlag(QFileInfoPrivate::CachedSize)) {
|
if (!d->getCachedFlag(QFileInfoPrivate::CachedSize)) {
|
||||||
d->setCachedFlag(QFileInfoPrivate::CachedSize);
|
d->setCachedFlag(QFileInfoPrivate::CachedSize);
|
||||||
d->fileSize = d->fileEngine->size();
|
d->fileSize = d->fileEngine->size();
|
||||||
}
|
}
|
||||||
return d->fileSize;
|
return d->fileSize;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
#if QT_DEPRECATED_SINCE(5, 10)
|
#if QT_DEPRECATED_SINCE(5, 10)
|
||||||
@ -1394,11 +1346,6 @@ QDateTime QFileInfo::fileTime(QFile::FileTime time) const
|
|||||||
|
|
||||||
Q_D(const QFileInfo);
|
Q_D(const QFileInfo);
|
||||||
auto fetime = QAbstractFileEngine::FileTime(time);
|
auto fetime = QAbstractFileEngine::FileTime(time);
|
||||||
if (d->isDefaultConstructed)
|
|
||||||
return QDateTime();
|
|
||||||
if (d->fileEngine)
|
|
||||||
return d->getFileTime(fetime).toLocalTime();
|
|
||||||
|
|
||||||
QFileSystemMetaData::MetaDataFlags flag;
|
QFileSystemMetaData::MetaDataFlags flag;
|
||||||
switch (time) {
|
switch (time) {
|
||||||
case QFile::FileAccessTime:
|
case QFile::FileAccessTime:
|
||||||
@ -1415,10 +1362,10 @@ QDateTime QFileInfo::fileTime(QFile::FileTime time) const
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!d->cache_enabled || !d->metaData.hasFlags(flag))
|
return d->checkAttribute<QDateTime>(
|
||||||
if (!QFileSystemEngine::fillMetaData(d->fileEntry, d->metaData, flag))
|
flag,
|
||||||
return QDateTime();
|
[=]() { return d->metaData.fileTime(fetime).toLocalTime(); },
|
||||||
return d->metaData.fileTime(fetime).toLocalTime();
|
[=]() { return d->getFileTime(fetime).toLocalTime(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -103,7 +103,7 @@ public:
|
|||||||
fileEngine(QFileSystemEngine::resolveEntryAndCreateLegacyEngine(fileEntry, metaData)),
|
fileEngine(QFileSystemEngine::resolveEntryAndCreateLegacyEngine(fileEntry, metaData)),
|
||||||
cachedFlags(0),
|
cachedFlags(0),
|
||||||
#ifndef QT_NO_FSFILEENGINE
|
#ifndef QT_NO_FSFILEENGINE
|
||||||
isDefaultConstructed(false),
|
isDefaultConstructed(file.isEmpty()),
|
||||||
#else
|
#else
|
||||||
isDefaultConstructed(!fileEngine),
|
isDefaultConstructed(!fileEngine),
|
||||||
#endif
|
#endif
|
||||||
@ -179,6 +179,27 @@ public:
|
|||||||
inline void setCachedFlag(uint c) const
|
inline void setCachedFlag(uint c) const
|
||||||
{ if (cache_enabled) cachedFlags |= c; }
|
{ if (cache_enabled) cachedFlags |= c; }
|
||||||
|
|
||||||
|
template <typename Ret, typename FSLambda, typename EngineLambda>
|
||||||
|
Ret checkAttribute(Ret defaultValue, QFileSystemMetaData::MetaDataFlags fsFlags, const FSLambda &fsLambda,
|
||||||
|
const EngineLambda &engineLambda) const
|
||||||
|
{
|
||||||
|
if (isDefaultConstructed)
|
||||||
|
return defaultValue;
|
||||||
|
if (fileEngine)
|
||||||
|
return engineLambda();
|
||||||
|
if (!cache_enabled || !metaData.hasFlags(fsFlags)) {
|
||||||
|
QFileSystemEngine::fillMetaData(fileEntry, metaData, fsFlags);
|
||||||
|
// ignore errors, fillMetaData will have cleared the flags
|
||||||
|
}
|
||||||
|
return fsLambda();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Ret, typename FSLambda, typename EngineLambda>
|
||||||
|
Ret checkAttribute(QFileSystemMetaData::MetaDataFlags fsFlags, const FSLambda &fsLambda,
|
||||||
|
const EngineLambda &engineLambda) const
|
||||||
|
{
|
||||||
|
return checkAttribute(Ret(), fsFlags, fsLambda, engineLambda);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -213,6 +213,8 @@ QString QFileSystemEngine::resolveUserName(const QFileSystemEntry &entry, QFileS
|
|||||||
#else //(Q_OS_UNIX)
|
#else //(Q_OS_UNIX)
|
||||||
if (!metaData.hasFlags(QFileSystemMetaData::UserId))
|
if (!metaData.hasFlags(QFileSystemMetaData::UserId))
|
||||||
QFileSystemEngine::fillMetaData(entry, metaData, QFileSystemMetaData::UserId);
|
QFileSystemEngine::fillMetaData(entry, metaData, QFileSystemMetaData::UserId);
|
||||||
|
if (!metaData.exists())
|
||||||
|
return QString();
|
||||||
return resolveUserName(metaData.userId());
|
return resolveUserName(metaData.userId());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -226,6 +228,8 @@ QString QFileSystemEngine::resolveGroupName(const QFileSystemEntry &entry, QFile
|
|||||||
#else //(Q_OS_UNIX)
|
#else //(Q_OS_UNIX)
|
||||||
if (!metaData.hasFlags(QFileSystemMetaData::GroupId))
|
if (!metaData.hasFlags(QFileSystemMetaData::GroupId))
|
||||||
QFileSystemEngine::fillMetaData(entry, metaData, QFileSystemMetaData::GroupId);
|
QFileSystemEngine::fillMetaData(entry, metaData, QFileSystemMetaData::GroupId);
|
||||||
|
if (!metaData.exists())
|
||||||
|
return QString();
|
||||||
return resolveGroupName(metaData.groupId());
|
return resolveGroupName(metaData.groupId());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -232,8 +232,9 @@ private slots:
|
|||||||
#endif
|
#endif
|
||||||
void group();
|
void group();
|
||||||
|
|
||||||
|
void invalidState_data();
|
||||||
void invalidState();
|
void invalidState();
|
||||||
void nonExistingFileDates();
|
void nonExistingFile();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const QString m_currentDir;
|
const QString m_currentDir;
|
||||||
@ -1366,7 +1367,7 @@ void tst_QFileInfo::isNativePath_data()
|
|||||||
QTest::addColumn<bool>("isNativePath");
|
QTest::addColumn<bool>("isNativePath");
|
||||||
|
|
||||||
QTest::newRow("default-constructed") << QString() << false;
|
QTest::newRow("default-constructed") << QString() << false;
|
||||||
QTest::newRow("empty") << QString("") << true;
|
QTest::newRow("empty") << QString("") << false;
|
||||||
|
|
||||||
QTest::newRow("local root") << QString::fromLatin1("/") << true;
|
QTest::newRow("local root") << QString::fromLatin1("/") << true;
|
||||||
QTest::newRow("local non-existent file") << QString::fromLatin1("/abrakadabra.boo") << true;
|
QTest::newRow("local non-existent file") << QString::fromLatin1("/abrakadabra.boo") << true;
|
||||||
@ -1896,64 +1897,96 @@ void tst_QFileInfo::group()
|
|||||||
QCOMPARE(fi.group(), expected);
|
QCOMPARE(fi.group(), expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_QFileInfo::invalidState()
|
static void stateCheck(const QFileInfo &info, const QString &dirname, const QString &filename)
|
||||||
{
|
{
|
||||||
// Shouldn't crash;
|
|
||||||
|
|
||||||
{
|
|
||||||
QFileInfo info;
|
|
||||||
QCOMPARE(info.size(), qint64(0));
|
QCOMPARE(info.size(), qint64(0));
|
||||||
QVERIFY(!info.exists());
|
QVERIFY(!info.exists());
|
||||||
|
|
||||||
info.setCaching(false);
|
QString path;
|
||||||
|
QString abspath;
|
||||||
info.created();
|
if (!dirname.isEmpty()) {
|
||||||
info.birthTime();
|
path = ".";
|
||||||
info.metadataChangeTime();
|
abspath = dirname + '/' + filename;
|
||||||
info.lastRead();
|
|
||||||
info.lastModified();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
QCOMPARE(info.filePath(), filename);
|
||||||
QFileInfo info("");
|
QCOMPARE(info.absoluteFilePath(), abspath);
|
||||||
QCOMPARE(info.size(), qint64(0));
|
QCOMPARE(info.canonicalFilePath(), QString());
|
||||||
QVERIFY(!info.exists());
|
QCOMPARE(info.fileName(), filename);
|
||||||
|
QCOMPARE(info.baseName(), filename);
|
||||||
|
QCOMPARE(info.completeBaseName(), filename);
|
||||||
|
QCOMPARE(info.suffix(), QString());
|
||||||
|
QCOMPARE(info.bundleName(), QString());
|
||||||
|
QCOMPARE(info.completeSuffix(), QString());
|
||||||
|
|
||||||
info.setCaching(false);
|
QVERIFY(info.isRelative());
|
||||||
|
QCOMPARE(info.path(), path);
|
||||||
|
QCOMPARE(info.absolutePath(), dirname);
|
||||||
|
QCOMPARE(info.dir().path(), ".");
|
||||||
|
|
||||||
info.created();
|
// these don't look right
|
||||||
info.birthTime();
|
QCOMPARE(info.canonicalPath(), path);
|
||||||
info.metadataChangeTime();
|
QCOMPARE(info.absoluteDir().path(), dirname.isEmpty() ? "." : dirname);
|
||||||
info.lastRead();
|
|
||||||
info.lastModified();
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
QVERIFY(!info.isReadable());
|
||||||
QFileInfo info("file-doesn't-really-exist.txt");
|
QVERIFY(!info.isWritable());
|
||||||
QCOMPARE(info.size(), qint64(0));
|
QVERIFY(!info.isExecutable());
|
||||||
QVERIFY(!info.exists());
|
QVERIFY(!info.isHidden());
|
||||||
|
QVERIFY(!info.isFile());
|
||||||
|
QVERIFY(!info.isDir());
|
||||||
|
QVERIFY(!info.isSymLink());
|
||||||
|
QVERIFY(!info.isBundle());
|
||||||
|
QVERIFY(!info.isRoot());
|
||||||
|
QCOMPARE(info.isNativePath(), !filename.isEmpty());
|
||||||
|
|
||||||
info.setCaching(false);
|
QCOMPARE(info.readLink(), QString());
|
||||||
|
QCOMPARE(info.ownerId(), uint(-2));
|
||||||
|
QCOMPARE(info.groupId(), uint(-2));
|
||||||
|
QCOMPARE(info.owner(), QString());
|
||||||
|
QCOMPARE(info.group(), QString());
|
||||||
|
|
||||||
info.created();
|
QCOMPARE(info.permissions(), QFile::Permissions());
|
||||||
info.birthTime();
|
|
||||||
info.metadataChangeTime();
|
|
||||||
info.lastRead();
|
|
||||||
info.lastModified();
|
|
||||||
}
|
|
||||||
|
|
||||||
QVERIFY(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tst_QFileInfo::nonExistingFileDates()
|
|
||||||
{
|
|
||||||
QFileInfo info("non-existing-file.foobar");
|
|
||||||
QVERIFY(!info.exists());
|
|
||||||
QVERIFY(!info.created().isValid());
|
QVERIFY(!info.created().isValid());
|
||||||
QVERIFY(!info.birthTime().isValid());
|
QVERIFY(!info.birthTime().isValid());
|
||||||
QVERIFY(!info.metadataChangeTime().isValid());
|
QVERIFY(!info.metadataChangeTime().isValid());
|
||||||
QVERIFY(!info.lastRead().isValid());
|
QVERIFY(!info.lastRead().isValid());
|
||||||
QVERIFY(!info.lastModified().isValid());
|
QVERIFY(!info.lastModified().isValid());
|
||||||
|
};
|
||||||
|
|
||||||
|
void tst_QFileInfo::invalidState_data()
|
||||||
|
{
|
||||||
|
QTest::addColumn<int>("mode");
|
||||||
|
QTest::newRow("default") << 0;
|
||||||
|
QTest::newRow("empty") << 1;
|
||||||
|
QTest::newRow("copy-of-default") << 2;
|
||||||
|
QTest::newRow("copy-of-empty") << 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_QFileInfo::invalidState()
|
||||||
|
{
|
||||||
|
// Shouldn't crash or produce warnings
|
||||||
|
QFETCH(int, mode);
|
||||||
|
const QFileInfo &info = (mode & 1 ? QFileInfo("") : QFileInfo());
|
||||||
|
|
||||||
|
if (mode & 2) {
|
||||||
|
QFileInfo copy(info);
|
||||||
|
stateCheck(copy, QString(), QString());
|
||||||
|
} else {
|
||||||
|
stateCheck(info, QString(), QString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_QFileInfo::nonExistingFile()
|
||||||
|
{
|
||||||
|
QString dirname = QDir::currentPath();
|
||||||
|
QString cdirname = QFileInfo(dirname).canonicalFilePath();
|
||||||
|
if (dirname != cdirname)
|
||||||
|
QDir::setCurrent(cdirname); // chdir() to our canonical path
|
||||||
|
|
||||||
|
QString filename = "non-existing-file-foobar";
|
||||||
|
QFileInfo info(filename);
|
||||||
|
stateCheck(info, dirname, filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
QTEST_MAIN(tst_QFileInfo)
|
QTEST_MAIN(tst_QFileInfo)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user