File indexing completed on 2023-09-24 04:08:35
0001 /* 0002 kdiskfreespaceinfo.h 0003 SPDX-FileCopyrightText: 2008 Sebastian Trug <trueg@kde.org> 0004 0005 Based on kdiskfreespace.h 0006 SPDX-FileCopyrightText: 2007 David Faure <faure@kde.org> 0007 SPDX-FileCopyrightText: 2008 Dirk Mueller <mueller@kde.org> 0008 0009 SPDX-License-Identifier: LGPL-2.0-only 0010 */ 0011 0012 #include "kdiskfreespaceinfo.h" 0013 0014 #include <QFile> 0015 #include <QSharedData> 0016 0017 #include <kmountpoint.h> 0018 0019 #ifdef Q_OS_WIN 0020 #include <QDir> 0021 #include <qt_windows.h> 0022 #else 0023 #include <sys/statvfs.h> 0024 #endif 0025 0026 #if KIOCORE_BUILD_DEPRECATED_SINCE(5, 88) 0027 class KDiskFreeSpaceInfoPrivate : public QSharedData 0028 { 0029 public: 0030 bool m_valid = false; 0031 QString m_mountPoint; 0032 KIO::filesize_t m_size = 0; 0033 KIO::filesize_t m_available = 0; 0034 }; 0035 0036 KDiskFreeSpaceInfo::KDiskFreeSpaceInfo() 0037 : d(new KDiskFreeSpaceInfoPrivate) 0038 { 0039 } 0040 0041 KDiskFreeSpaceInfo::KDiskFreeSpaceInfo(const KDiskFreeSpaceInfo &other) 0042 { 0043 d = other.d; 0044 } 0045 0046 KDiskFreeSpaceInfo::~KDiskFreeSpaceInfo() 0047 { 0048 } 0049 0050 KDiskFreeSpaceInfo &KDiskFreeSpaceInfo::operator=(const KDiskFreeSpaceInfo &other) 0051 { 0052 d = other.d; 0053 return *this; 0054 } 0055 0056 bool KDiskFreeSpaceInfo::isValid() const 0057 { 0058 return d->m_valid; 0059 } 0060 0061 QString KDiskFreeSpaceInfo::mountPoint() const 0062 { 0063 return d->m_mountPoint; 0064 } 0065 0066 KIO::filesize_t KDiskFreeSpaceInfo::size() const 0067 { 0068 return d->m_size; 0069 } 0070 0071 KIO::filesize_t KDiskFreeSpaceInfo::available() const 0072 { 0073 return d->m_available; 0074 } 0075 0076 KIO::filesize_t KDiskFreeSpaceInfo::used() const 0077 { 0078 return d->m_size - d->m_available; 0079 } 0080 0081 KDiskFreeSpaceInfo KDiskFreeSpaceInfo::freeSpaceInfo(const QString &path) 0082 { 0083 KDiskFreeSpaceInfo info; 0084 0085 // determine the mount point 0086 KMountPoint::Ptr mp = KMountPoint::currentMountPoints().findByPath(path); 0087 if (mp) { 0088 info.d->m_mountPoint = mp->mountPoint(); 0089 } 0090 0091 #ifdef Q_OS_WIN 0092 quint64 availUser; 0093 QFileInfo fi(info.d->m_mountPoint); 0094 QString dir = QDir::toNativeSeparators(fi.absoluteDir().canonicalPath()); 0095 0096 if (GetDiskFreeSpaceExW((LPCWSTR)dir.utf16(), (PULARGE_INTEGER)&availUser, (PULARGE_INTEGER)&info.d->m_size, (PULARGE_INTEGER)&info.d->m_available) != 0) { 0097 info.d->m_valid = true; 0098 } 0099 #else 0100 struct statvfs statvfs_buf; 0101 0102 // Prefer mountPoint if available, so that it even works with non-existing files. 0103 const QString pathArg = info.d->m_mountPoint.isEmpty() ? path : info.d->m_mountPoint; 0104 if (!statvfs(QFile::encodeName(pathArg).constData(), &statvfs_buf)) { 0105 const quint64 blksize = quint64(statvfs_buf.f_frsize); // cast to avoid overflow 0106 info.d->m_available = statvfs_buf.f_bavail * blksize; 0107 info.d->m_size = statvfs_buf.f_blocks * blksize; 0108 info.d->m_valid = true; 0109 } 0110 #endif 0111 0112 return info; 0113 } 0114 #endif // Deprecation