Как определить, сколько свободного места на диске в Qt? - PullRequest
15 голосов
/ 14 ноября 2009

Я использую Qt и хочу независимый от платформы способ получения доступного свободного дискового пространства.

Я знаю, что в Linux я могу использовать statfs, а в Windows - GetDiskFreeSpaceEx(). Я знаю, что у повышения есть способ, boost::filesystem::space(Path const & p).

Но я не хочу их. Я нахожусь в Qt и хотел бы сделать это дружественным для Qt способом.

Я посмотрел на QDir, QFile, QFileInfo - ничего!

Ответы [ 7 ]

24 голосов
/ 23 ноября 2015

Я знаю, что это довольно старая тема, но кто-то может найти ее полезной.

Начиная с 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

11 голосов
/ 30 марта 2015

Новый класс QStorageInfo , представленный в Qt 5.4, может сделать это (и больше). Он является частью модуля 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";
}
6 голосов
/ 14 ноября 2009

На момент написания статьи в Qt ничего нет.

Рассмотрите возможность комментировать или голосовать за QTBUG-3780 .

5 голосов
/ 29 января 2010

Я написал это обратно, когда написал вопрос (после голосования по 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 голосов
/ 06 ноября 2012

Я знаю, что этот вопрос уже довольно старый, но я искал stackoverflow и обнаружил, что никто не получил решения для этого, поэтому я решил опубликовать.

В QtMobility имеется класс QSystemStorageInfo , который обеспечивает кросс-платформенный способ получения информации о логических дисках. Например: logicDrives () возвращает список путей, которые вы можете использовать в качестве параметров для других методов: availableDiskSpace () , totalDiskSpace () , чтобы получить бесплатную и общую сумму дисковое пространство, соответственно, в байтах.

Пример использования:

QtMobility::QSystemStorageInfo sysStrgInfo;
QStringList drives = sysStrgInfo.logicalDrives();

foreach (QString drive, drives)
{
    qDebug() << sysStrgInfo.availableDiskSpace(drive);
    qDebug() << sysStrgInfo.totalDiskSpace(drive);
}

В этом примере печатается свободное и общее пространство в байтах для всех логических дисков в ОС. Не забудьте добавить QtMobility в файл проекта Qt:

CONFIG += mobility
MOBILITY += systeminfo

Я использовал эти методы в проекте, над которым я сейчас работаю, и он сработал для меня. Надеюсь, это кому-нибудь поможет!

4 голосов
/ 30 августа 2011

Мне нужно записать на подключенную USB-флешку, и я получил доступный объем памяти со следующим кодом:

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);
2 голосов
/ 03 августа 2015

этот код работает для меня:

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...