2009-11-14 18 views
14

Ich verwende Qt und möchte eine plattformunabhängige Möglichkeit, den verfügbaren freien Speicherplatz zu bekommen.Wie ermittelt man, wie viel freier Speicherplatz auf einem Laufwerk in Qt?

Ich weiß in Linux kann ich statfs verwenden und in Windows kann ich GetDiskFreeSpaceEx() verwenden. Ich weiß Boost hat einen Weg, boost::filesystem::space(Path const & p).

Aber ich will diese nicht. Ich bin in Qt und würde es gerne Qt-freundlich machen.

Ich sah QDir, QFile, QFileInfo - nichts!

+0

es in QT 5.5 docs kopiert saugen und verwenden Sie den Windows-API, Ungeheuerlichkeit, dass es ist. – JimDaniel

+0

Sieht so aus, als ob ich die Linux-Version auf der Straße erledigen muss. Freude. – dwj

+0

Es gibt immer [APR] (https://apr.apache.org/). –

Antwort

14

Ich weiß, es ist ziemlich altes Thema, aber noch jemand es nützlich finden.

Seit QT 5.4 ist die QSystemStorageInfo eingestellt, stattdessen gibt es eine neue Klasse QStorageInfo, die die gesamte Aufgabe wirklich einfach macht und es plattformübergreifend ist.

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

-Code aus dem Beispiel wurde

+1

Und die Welt ist gerade ein bisschen besser geworden. Danke, @ mr.coffee – dwj

+0

"... jemand kann es immer noch nützlich finden." Vier Somebodies bis jetzt! –

+0

Egal, dass ich die gleiche Antwort 8 Monate zuvor gab ... –

6

Zum Zeitpunkt des Schreibens gibt es nichts in Qt.

Erwägen Sie oder kommentieren Sie für QTBUG-3780.

+2

Es ist bedauerlich, dass sich seit den Mailing-Listen-Posts, die ich 2004/2005 gefunden habe, nichts daran geändert hat. Auf der Qt-Website abgestimmt. – dwj

+0

Und jetzt Teil von Qt 5.4+! – dwj

3

Ich schrieb dies zurück, als ich die Frage schrieb (nach der Abstimmung auf QTBUG-3780); Ich denke, ich werde jemanden (oder mich) davor bewahren, das von Grund auf neu zu machen.

Dies ist für 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 

Verbrauch:

// 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 
+0

... es ist nicht die Qt-freundliche Art :) nicht crossplatform – fecub

+0

@FeritCubukcuoglu Am sichersten nicht, aber es war, was zu der Zeit funktionierte. Ein neuer Beitrag kam kürzlich, der einige der neuen Fähigkeiten von Qt 5.5 verwendet; es ist jetzt die akzeptierte Antwort. – dwj

4

Ich muss montiertem USB-Stick schreiben und ich bekam die verfügbare Größe des Speichers mit dem folgenden Code:

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); 
4

Ich weiß, dass diese Die Frage ist schon ziemlich alt, aber ich habe stackoverflow gesucht und festgestellt, dass niemand eine Lösung dafür hat, also habe ich mich entschieden zu posten.

Es gibt QSystemStorageInfo Klasse in QtMobility, es bietet plattformübergreifende Art und Weise Informationen über logische Laufwerke zu bekommen. Zum Beispiel: logicalDrives() kehrt Liste von Pfaden, die Sie als Parameter für andere Methoden verwenden: availableDiskSpace(), totalDiskSpace() zu freiem und gesamten Auto Raum dementsprechend in Bytes zu erhalten.

Anwendungsbeispiel:

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

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

Dieses Beispiel druckt freien und gesamten Raum in Bytes für alle logischen Laufwerke in OS. Vergessen Sie nicht, QtMobility in Qt Projektdatei hinzuzufügen:

CONFIG += mobility 
MOBILITY += systeminfo 

ich verwendet, um diese Methoden in einem Projekt arbeite ich jetzt auf und es funktionierte für mich. Ich hoffe, es wird jemandem helfen!

8

Die neue Klasse QStorageInfo, eingeführt in Qt 5.4, kann dies (und mehr). Es ist Teil des Qt Core-Moduls, daher sind keine zusätzlichen Abhängigkeiten erforderlich.

#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()/1000/1000 << "MB"; 
    qDebug() << "free space:" << storage.bytesAvailable()/1000/1000 << "MB"; 
} 
2

diese code`s für mich arbeiten:

#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; 
} 
Verwandte Themen