Utils: Introduce FilePath::fileSize()

And implement it locally and for docker.

Change-Id: I362f4cae95560836d9300473a286429eb4569329
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2021-07-23 12:06:38 +02:00
parent dbc708fe61
commit 764bf7396c
10 changed files with 46 additions and 0 deletions

View File

@@ -1279,6 +1279,15 @@ bool FilePath::renameFile(const FilePath &target) const
return QFile::rename(path(), target.path()); return QFile::rename(path(), target.path());
} }
qint64 FilePath::fileSize() const
{
if (needsDevice()) {
QTC_ASSERT(s_deviceHooks.fileSize, return false);
return s_deviceHooks.fileSize(*this);
}
return QFileInfo(m_data).size();
}
QTextStream &operator<<(QTextStream &s, const FilePath &fn) QTextStream &operator<<(QTextStream &s, const FilePath &fn)
{ {
return s << fn.toString(); return s << fn.toString();

View File

@@ -139,6 +139,7 @@ public:
bool removeRecursively(QString *error = nullptr) const; bool removeRecursively(QString *error = nullptr) const;
bool copyFile(const FilePath &target) const; bool copyFile(const FilePath &target) const;
bool renameFile(const FilePath &target) const; bool renameFile(const FilePath &target) const;
qint64 fileSize() const;
Qt::CaseSensitivity caseSensitivity() const; Qt::CaseSensitivity caseSensitivity() const;

View File

@@ -86,6 +86,7 @@ public:
std::function<QFile::Permissions(const FilePath &)> permissions; std::function<QFile::Permissions(const FilePath &)> permissions;
std::function<OsType(const FilePath &)> osType; std::function<OsType(const FilePath &)> osType;
std::function<Environment(const FilePath &)> environment; std::function<Environment(const FilePath &)> environment;
std::function<qint64(const FilePath &)> fileSize;
}; };
class QTCREATOR_UTILS_EXPORT FileUtils { class QTCREATOR_UTILS_EXPORT FileUtils {

View File

@@ -1275,6 +1275,20 @@ FilePath DockerDevice::symLinkTarget(const FilePath &filePath) const
return output.isEmpty() ? FilePath() : filePath.withNewPath(output); return output.isEmpty() ? FilePath() : filePath.withNewPath(output);
} }
qint64 DockerDevice::fileSize(const FilePath &filePath) const
{
QTC_ASSERT(handlesFile(filePath), return -1);
tryCreateLocalFileAccess();
if (hasLocalFileAccess()) {
const FilePath localAccess = mapToLocalAccess(filePath);
LOG("File size? " << filePath.toUserOutput() << localAccess.toUserOutput() << localAccess.fileSize());
return localAccess.fileSize();
}
const QString output = d->outputForRunInShell({"stat", {"-c", "%s", filePath.path()}});
return output.toLongLong();
}
static FilePaths filterEntriesHelper(const FilePath &base, static FilePaths filterEntriesHelper(const FilePath &base,
const QStringList &entries, const QStringList &entries,
const QStringList &nameFilters, const QStringList &nameFilters,

View File

@@ -99,6 +99,7 @@ public:
bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data) const override; bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data) const override;
QDateTime lastModified(const Utils::FilePath &filePath) const override; QDateTime lastModified(const Utils::FilePath &filePath) const override;
void runProcess(Utils::QtcProcess &process) const override; void runProcess(Utils::QtcProcess &process) const override;
qint64 fileSize(const Utils::FilePath &filePath) const override;
Utils::Environment systemEnvironment() const override; Utils::Environment systemEnvironment() const override;

View File

@@ -190,6 +190,12 @@ QList<FilePath> DesktopDevice::directoryEntries(const FilePath &filePath,
return Utils::transform(entryInfoList, &FilePath::fromFileInfo); return Utils::transform(entryInfoList, &FilePath::fromFileInfo);
} }
qint64 DesktopDevice::fileSize(const FilePath &filePath) const
{
QTC_ASSERT(handlesFile(filePath), return -1);
return filePath.fileSize();
}
Environment DesktopDevice::systemEnvironment() const Environment DesktopDevice::systemEnvironment() const
{ {
return Environment::systemEnvironment(); return Environment::systemEnvironment();

View File

@@ -79,6 +79,7 @@ public:
Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const override; Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const override;
QByteArray fileContents(const Utils::FilePath &filePath, qint64 limit, qint64 offset) const override; QByteArray fileContents(const Utils::FilePath &filePath, qint64 limit, qint64 offset) const override;
bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data) const override; bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data) const override;
qint64 fileSize(const Utils::FilePath &filePath) const override;
protected: protected:
DesktopDevice(); DesktopDevice();

View File

@@ -525,6 +525,12 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_unique<DeviceManager
return device->systemEnvironment(); return device->systemEnvironment();
}; };
deviceHooks.fileSize = [](const FilePath &filePath) {
auto device = DeviceManager::deviceForPath(filePath);
QTC_ASSERT(device, return qint64(-1));
return device->fileSize(filePath);
};
FileUtils::setDeviceFileHooks(deviceHooks); FileUtils::setDeviceFileHooks(deviceHooks);
DeviceProcessHooks processHooks; DeviceProcessHooks processHooks;

View File

@@ -409,6 +409,12 @@ Environment IDevice::systemEnvironment() const
return Environment::systemEnvironment(); return Environment::systemEnvironment();
} }
qint64 IDevice::fileSize(const FilePath &filePath) const
{
QTC_CHECK(false);
return -1;
}
IDevice::~IDevice() = default; IDevice::~IDevice() = default;
/*! /*!

View File

@@ -267,6 +267,7 @@ public:
virtual QFile::Permissions permissions(const Utils::FilePath &filePath) const; virtual QFile::Permissions permissions(const Utils::FilePath &filePath) const;
virtual void runProcess(Utils::QtcProcess &process) const; virtual void runProcess(Utils::QtcProcess &process) const;
virtual Utils::Environment systemEnvironment() const; virtual Utils::Environment systemEnvironment() const;
virtual qint64 fileSize(const Utils::FilePath &filePath) const;
virtual void aboutToBeRemoved() const {} virtual void aboutToBeRemoved() const {}