File indexing completed on 2025-02-02 03:49:25
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 }