2009-11-14 15 views
14

Estoy usando Qt y quiero una forma independiente de la plataforma de obtener el espacio libre en disco disponible.¿Cómo determinar cuánto espacio libre hay en una unidad en Qt?

Sé que en Linux puedo usar statfs y en Windows puedo usar GetDiskFreeSpaceEx(). Sé que boost tiene un camino, boost::filesystem::space(Path const & p).

Pero no los quiero. Estoy en Qt y me gustaría hacerlo de forma compatible con Qt.

Miré QDir, QFile, QFileInfo - ¡nada!

+0

que aguantar y utilizar la API de Windows, monstruosidad que es. – JimDaniel

+0

Parece que tendré que hacerlo y luego trataré con la versión de Linux en el camino también. Alegría. – dwj

+0

Siempre hay [APR] (https://apr.apache.org/). –

Respuesta

14

Sé que es tema bastante viejo pero alguien todavía puede encontrar útil.

Desde QT 5.4 se interrumpe la QSystemStorageInfo, en su lugar hay una clase nueva QStorageInfo que hace toda la tarea muy simple y es multiplataforma.

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

Código ha sido copiado del ejemplo en QT 5.5 docs

+1

Y el mundo ha mejorado un poco. Gracias, @ mr.coffee – dwj

+0

"... alguien aún puede encontrarlo útil". ¡Cuatro personas por ahora! –

+0

No importa que di la misma respuesta 8 meses antes ... –

6

No hay nada en Qt al momento de escribir.

Considere comentar o votar por QTBUG-3780.

+2

Es desafortunado que nada haya cambiado sobre esto desde las publicaciones de la lista de correo que encontré desde 2004/2005. Votado en el sitio de Qt. – dwj

+0

¡Y ahora parte de Qt 5.4+! – dwj

3

Escribí esto cuando escribí la pregunta (después de votar en QTBUG-3780); Me imagino que voy a salvar a alguien (o a mí mismo) de hacer esto desde cero.

Esto es para 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 

Uso:

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

... no es el modo Qt-friendly :) no es una plataforma cruzada – fecub

+0

@FeritCubukcuoglu Definitivamente no, pero fue lo que funcionó en ese momento. Recientemente apareció una nueva publicación que usa algunas de las nuevas capacidades de Qt 5.5; ahora es la respuesta aceptada. – dwj

4

Tengo que escribir a una montada USB-Stick y me dieron el tamaño disponible de la memoria con el siguiente código:

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

sé que este La pregunta ya es bastante antigua, pero busqué Stackoverflow y descubrí que nadie tenía solución para esto, así que decidí publicar.

Hay QSystemStorageInfo clase en QtMobility, se proporciona una forma de plataforma cruzada para obtener información sobre las unidades lógicas. Por ejemplo: logicalDrives() devuelve una lista de rutas que puede usar como parámetros para otros métodos: availableDiskSpace(), totalDiskSpace() para obtener el espacio total y libre del disco, en consecuencia, en bytes.

Ejemplo de uso:

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

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

En este ejemplo se imprime el espacio libre y total en bytes para todas las unidades lógicas en OS. No se olvide de añadir QtMobility en el archivo de proyecto Qt:

CONFIG += mobility 
MOBILITY += systeminfo 

he usado estos métodos en un proyecto que estoy trabajando ahora y funcionó para mí. Espero que ayude a alguien!

8

La nueva clase QStorageInfo, presentada en Qt 5.4, puede hacer esto (y más). Es parte del módulo Qt Core por lo que no se requieren dependencias adicionales.

#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

este code`s trabajando para mí:

#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; 
} 
Cuestiones relacionadas