我正在使用Qt,并且想要一种独立于平台的方式来获取可用的可用磁盘空间。
我知道在Linux中我可以使用statfs
而在Windows中我可以使用GetDiskFreeSpaceEx()
。我知道助推有一种方法,boost::filesystem::space(Path const & p)
。
但我不想要那些。我在Qt,并希望以对Qt友好的方式进行。
我查看了QDir
,QFile
,QFileInfo
- 没有!
答案 0 :(得分:23)
我知道这是一个相当古老的主题,但有人仍然觉得它很有用。
自QT 5.4起,QSystemStorageInfo
停止了,而是有一个新的类QStorageInfo
,它使整个任务变得非常简单,并且它是跨平台的。
QStorageInfo storage = QStorageInfo::root();
qDebug() << storage.rootPath();
if (storage.isReadOnly())
qDebug() << "isReadOnly:" << storage.isReadOnly();
qDebug() << "name:" << storage.name();
qDebug() << "fileSystemType:" << storage.fileSystemType();
qDebug() << "size:" << storage.bytesTotal()/1000/1000 << "MB";
qDebug() << "availableSize:" << storage.bytesAvailable()/1000/1000 << "MB";
中的示例复制了代码
答案 1 :(得分:11)
Qt 5.4中引入的新QStorageInfo类可以做到这一点(以及更多)。它是Qt Core模块的一部分,因此不需要额外的依赖项。
#include <QStorageInfo>
#include <QDebug>
void printRootDriveInfo() {
QStorageInfo storage = QStorageInfo::root();
qDebug() << storage.rootPath();
if (storage.isReadOnly())
qDebug() << "isReadOnly:" << storage.isReadOnly();
qDebug() << "name:" << storage.name();
qDebug() << "filesystem type:" << storage.fileSystemType();
qDebug() << "size:" << storage.bytesTotal()/1024/1024 << "MB";
qDebug() << "free space:" << storage.bytesAvailable()/1024/1024 << "MB";
}
答案 2 :(得分:6)
在撰写本文时,Qt中没有任何内容。
考虑对QTBUG-3780进行评论或投票。
答案 3 :(得分:5)
当我写这个问题时(我在QTBUG-3780投票后),我写了回来;我想我会从头开始拯救某人(或我自己)。
这是Qt 4.8.x。
#ifdef WIN32
/*
* getDiskFreeSpaceInGB
*
* Returns the amount of free drive space for the given drive in GB. The
* value is rounded to the nearest integer value.
*/
int getDiskFreeSpaceInGB( LPCWSTR drive )
{
ULARGE_INTEGER freeBytesToCaller;
freeBytesToCaller.QuadPart = 0L;
if( !GetDiskFreeSpaceEx( drive, &freeBytesToCaller, NULL, NULL ) )
{
qDebug() << "ERROR: Call to GetDiskFreeSpaceEx() failed.";
}
int freeSpace_gb = freeBytesToCaller.QuadPart / B_per_GB;
qDebug() << "Free drive space: " << freeSpace_gb << "GB";
return freeSpace_gb;
}
#endif
用法:
// Check available hard drive space
#ifdef WIN32
// The L in front of the string does some WINAPI magic to convert
// a string literal into a Windows LPCWSTR beast.
if( getDiskFreeSpaceInGB( L"c:" ) < MinDriveSpace_GB )
{
errString = "ERROR: Less than the recommended amount of free space available!";
isReady = false;
}
#else
# pragma message( "WARNING: Hard drive space will not be checked at application start-up!" )
#endif
答案 4 :(得分:4)
我需要写入已安装的USB-Stick,并使用以下代码获得可用的内存大小:
QFile usbMemoryInfo;
QStringList usbMemoryLines;
QStringList usbMemoryColumns;
system("df /dev/sdb1 > /tmp/usb_usage.info");
usbMemoryInfo.setFileName( "/tmp/usb_usage.info" );
usbMemoryInfo.open(QIODevice::ReadOnly);
QTextStream readData(&usbMemoryInfo);
while (!readData.atEnd())
{
usbMemoryLines << readData.readLine();
}
usbMemoryInfo.close();
usbMemoryColumns = usbMemoryLines.at(1).split(QRegExp("\\s+"));
QString available_bytes = usbMemoryColumns.at(3);
答案 5 :(得分:4)
我知道这个问题现在已经很老了,但我搜索了stackoverflow,发现没有人为此解决问题,所以我决定发帖。
QtMobility 中有 QSystemStorageInfo 类,它提供了跨平台方式来获取有关逻辑驱动器的信息。例如: logicalDrives()返回可用作其他方法参数的路径列表: availableDiskSpace(), totalDiskSpace()因此,以字节为单位的空闲和总驱动器空间。
用法示例:
QtMobility::QSystemStorageInfo sysStrgInfo;
QStringList drives = sysStrgInfo.logicalDrives();
foreach (QString drive, drives)
{
qDebug() << sysStrgInfo.availableDiskSpace(drive);
qDebug() << sysStrgInfo.totalDiskSpace(drive);
}
此示例打印OS中所有逻辑驱动器的空闲和总空间(以字节为单位)。不要忘记在Qt项目文件中添加 QtMobility :
CONFIG += mobility
MOBILITY += systeminfo
我在我正在进行的项目中使用了这些方法,它对我有用。希望它能帮助别人!
答案 6 :(得分:2)
这段代码为我工作:
#ifdef _WIN32 //win
#include "windows.h"
#else //linux
#include <sys/stat.h>
#include <sys/statfs.h>
#endif
bool GetFreeTotalSpace(const QString& sDirPath, double& fTotal, double& fFree)
{
double fKB = 1024;
#ifdef _WIN32
QString sCurDir = QDir::current().absolutePath();
QDir::setCurrent(sDirPath);
ULARGE_INTEGER free,total;
bool bRes = ::GetDiskFreeSpaceExA( 0 , &free , &total , NULL );
if ( !bRes )
return false;
QDir::setCurrent( sCurDir );
fFree = static_cast<__int64>(free.QuadPart) / fKB;
fTotal = static_cast<__int64>(total.QuadPart) / fKB;
#else // Linux
struct stat stst;
struct statfs stfs;
if ( ::stat(sDirPath.toLocal8Bit(),&stst) == -1 )
return false;
if ( ::statfs(sDirPath.toLocal8Bit(),&stfs) == -1 )
return false;
fFree = stfs.f_bavail * ( stst.st_blksize / fKB );
fTotal = stfs.f_blocks * ( stst.st_blksize / fKB );
#endif // _WIN32
return true;
}