File indexing completed on 2024-05-05 03:56:08

0001 /*
0002     This file is part of the KDE project
0003     SPDX-FileCopyrightText: 2008 Tobias Koenig <tokoe@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "discspaceutil.h"
0009 #include "kiotrashdebug.h"
0010 
0011 #include <QDirIterator>
0012 #include <QFileInfo>
0013 #include <QStorageInfo>
0014 
0015 #include <qplatformdefs.h> // QT_LSTAT, QT_STAT, QT_STATBUF
0016 
0017 DiscSpaceUtil::DiscSpaceUtil(const QString &directory)
0018     : mFullSize(0)
0019 {
0020     QStorageInfo storageInfo(directory);
0021     if (storageInfo.isValid() && storageInfo.isReady()) {
0022         mFullSize = storageInfo.bytesTotal();
0023         mMountPoint = storageInfo.rootPath();
0024     }
0025 }
0026 
0027 qint64 DiscSpaceUtil::sizeOfPath(const QString &path)
0028 {
0029     QFileInfo info(path);
0030     if (!info.exists()) {
0031         return 0;
0032     }
0033 
0034     if (info.isSymLink()) {
0035         // QFileInfo::size does not return the actual size of a symlink. #253776
0036         QT_STATBUF buff;
0037         return QT_LSTAT(QFile::encodeName(path).constData(), &buff) == 0 ? buff.st_size : 0;
0038     }
0039 
0040     if (info.isFile()) {
0041         return info.size();
0042     }
0043 
0044     if (info.isDir()) {
0045         QDirIterator it(path, QDirIterator::NoIteratorFlags);
0046 
0047         qint64 sum = 0;
0048         while (it.hasNext()) {
0049             it.next();
0050             const QFileInfo info = it.fileInfo();
0051             const QString name = info.fileName();
0052 
0053             if (name != QLatin1Char('.') && name != QLatin1String("..")) {
0054                 sum += sizeOfPath(info.absoluteFilePath());
0055             }
0056         }
0057 
0058         return sum;
0059     }
0060 
0061     return 0;
0062 }
0063 
0064 double DiscSpaceUtil::usage(qint64 size) const
0065 {
0066     if (mFullSize == 0) {
0067         return 0;
0068     }
0069 
0070     return (static_cast<double>(size) * 100) / static_cast<double>(mFullSize);
0071 }
0072 
0073 qint64 DiscSpaceUtil::size() const
0074 {
0075     return mFullSize;
0076 }
0077 
0078 QString DiscSpaceUtil::mountPoint() const
0079 {
0080     return mMountPoint;
0081 }