如何确定Qt中驱动器上有多少可用空间?

时间:2009-11-14 00:16:23

标签: c++ qt filesystems

我正在使用Qt,并且想要一种独立于平台的方式来获取可用的可用磁盘空间。

我知道在Linux中我可以使用statfs而在Windows中我可以使用GetDiskFreeSpaceEx()。我知道助推有一种方法,boost::filesystem::space(Path const & p)

但我不想要那些。我在Qt,并希望以对Qt友好的方式进行。

我查看了QDirQFileQFileInfo - 没有!

7 个答案:

答案 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";
  

已从QT 5.5 docs

中的示例复制了代码

答案 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;
}