一、背景
近日,接到产品需求,需要在程序启动的时候,判断磁盘剩余空间大小,当磁盘空间小于一定的值时,弹出警告,提示用户,接下来的操作可能会因为磁盘空间不足导致操作失败!
好,废话少说,让我们一起来看看怎么实现吧!
二、实现方法
方法一:
使用QT自带的类QStorageInfo,获取磁盘信息:
注意: linux平台获取的是根目录下的磁盘空间;
优点: QT自带,不需要区分平台
代码如下:
int AppManager::getDiskFreeGB(const QString &disk)
{
int totalGB = 0;
int freeGB = 0;
QString curDisk = disk;
if(curDisk.isEmpty())
{
curDisk = QCoreApplication::applicationDirPath(); //我这获取的是程序安装的磁盘空间
// QStorageInfo ROM = QStorageInfo::root(); 获取当前系统盘 win: C盘
QStorageInfo SD;
SD.setPath(curDisk);
SD.refresh();
totalGB = SD.bytesTotal()/1024/1024/1024;
freeGB = SD.bytesFree()/1024/1024/1024 ;
INFOLOG("文件系统路径:{0}",SD.rootPath().toStdString());
INFOLOG("文件系统类型:{0}", SD.fileSystemType().toStdString());
qDebug() << "总大小:" << totalGB << "GB";
qDebug() << "可用空间:" << freeGB << "GB";
}
INFOLOG("总大小:{0}",totalGB);
INFOLOG("可用空间:{0}",freeGB);
return freeGB;
}
方法二:
使用window api 获取磁盘空间:
缺点: linux平台不兼容,代码需要区分平台
#include <QCoreApplication>
#include <QDebug>
#include <Windows.h>
#include <QStorageInfo>
double getDiskFreeSpace(QString driver)
{
#if defined(Q_OS_WIN32)
LPCWSTR lpcwstrDriver=(LPCWSTR)driver.utf16();
ULARGE_INTEGER liFreeBytesAvailable, liTotalBytes, liTotalFreeBytes;
if(!GetDiskFreeSpaceEx( lpcwstrDriver, &liFreeBytesAvailable, &liTotalBytes, &liTotalFreeBytes))
{
qDebug() << "ERROR: Call to GetDiskFreeSpaceEx() failed.";
return 0;
}
return (double) liTotalFreeBytes.QuadPart/1024/1024/1024;
#else
int state;
struct statvfs vfs;
fsblkcnt_t block_size = 0;
fsblkcnt_t free_size;
state = statvfs("/",&vfs);
if(state < 0){
printf("read statvfs error!!!\n");
}
block_size = vfs.f_bsize;
free_size = vfs.f_bfree * block_size;
return free_size/1024/1024/1024;
#endif
}
void getDiskInfo()
{
QStorageInfo ROM = QStorageInfo::root();
ROM.refresh(); //获得最新磁盘信息
qDebug() <<"文件系统路径:"<<ROM.rootPath();
if(ROM.isReadOnly())qDebug() << "只读文件系统:" << ROM.isReadOnly();
qDebug() << "文件系统类型:" << ROM.fileSystemType();
qDebug() << "总大小:" << ROM.bytesTotal()/1024/1024/1024 << "GB";
qDebug() << "可用空间:" << ROM.bytesAvailable()/1024/1024/1024 << "GB";
qDebug() << "可用空间:" << ROM.bytesFree()/1024/1024/1024 << "GB";
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug()<<"D free :"<<getDiskFreeSpace("D:")<<"GB";
getDiskInfo();
return a.exec();
}
好啦 ! 是不是很简单~