| 1 | /* |
| 2 | This file is part of the KDE project |
| 3 | SPDX-FileCopyrightText: 2008 Tobias Koenig <tokoe@kde.org> |
| 4 | |
| 5 | SPDX-License-Identifier: LGPL-2.0-or-later |
| 6 | */ |
| 7 | |
| 8 | #include "discspaceutil.h" |
| 9 | #include "kiotrashdebug.h" |
| 10 | |
| 11 | #include <QDirIterator> |
| 12 | #include <QFileInfo> |
| 13 | #include <QStorageInfo> |
| 14 | |
| 15 | #include <qplatformdefs.h> // QT_LSTAT, QT_STAT, QT_STATBUF |
| 16 | |
| 17 | DiscSpaceUtil::DiscSpaceUtil(const QString &directory) |
| 18 | : mFullSize(0) |
| 19 | { |
| 20 | QStorageInfo storageInfo(directory); |
| 21 | if (storageInfo.isValid() && storageInfo.isReady()) { |
| 22 | mFullSize = storageInfo.bytesTotal(); |
| 23 | mMountPoint = storageInfo.rootPath(); |
| 24 | } |
| 25 | } |
| 26 | |
| 27 | qint64 DiscSpaceUtil::sizeOfPath(const QString &path) |
| 28 | { |
| 29 | QFileInfo info(path); |
| 30 | if (!info.exists()) { |
| 31 | return 0; |
| 32 | } |
| 33 | |
| 34 | if (info.isSymLink()) { |
| 35 | // QFileInfo::size does not return the actual size of a symlink. #253776 |
| 36 | QT_STATBUF buff; |
| 37 | return QT_LSTAT(file: QFile::encodeName(fileName: path).constData(), buf: &buff) == 0 ? buff.st_size : 0; |
| 38 | } |
| 39 | |
| 40 | if (info.isFile()) { |
| 41 | return info.size(); |
| 42 | } |
| 43 | |
| 44 | if (info.isDir()) { |
| 45 | QDirIterator it(path, QDirIterator::NoIteratorFlags); |
| 46 | |
| 47 | qint64 sum = 0; |
| 48 | while (it.hasNext()) { |
| 49 | it.next(); |
| 50 | const QFileInfo info = it.fileInfo(); |
| 51 | const QString name = info.fileName(); |
| 52 | |
| 53 | if (name != QLatin1Char('.') && name != QLatin1String(".." )) { |
| 54 | sum += sizeOfPath(path: info.absoluteFilePath()); |
| 55 | } |
| 56 | } |
| 57 | |
| 58 | return sum; |
| 59 | } |
| 60 | |
| 61 | return 0; |
| 62 | } |
| 63 | |
| 64 | double DiscSpaceUtil::usage(qint64 size) const |
| 65 | { |
| 66 | if (mFullSize == 0) { |
| 67 | return 0; |
| 68 | } |
| 69 | |
| 70 | return (static_cast<double>(size) * 100) / static_cast<double>(mFullSize); |
| 71 | } |
| 72 | |
| 73 | qint64 DiscSpaceUtil::size() const |
| 74 | { |
| 75 | return mFullSize; |
| 76 | } |
| 77 | |
| 78 | QString DiscSpaceUtil::mountPoint() const |
| 79 | { |
| 80 | return mMountPoint; |
| 81 | } |
| 82 | |