como conseguir espacio libre en el disco duro

4 minutos de lectura

avatar de usuario
fa7eme

Quiero obtener el tamaño de disco duro gratis en un sistema remoto con ssh.
Encontré estas formas:
1-do it via command line: hdd's totalsize - sum of partitions size on that hdd + sum of free spaces on all partitions on that hdd;

Hay algunos problemas con esta forma.
Primero, prefiero no usar comandos, porque se complicará mucho, estará lleno de conversión de tipos entre sí. como cadena para flotar y… segundo es que con el comando en ejecución, no puedo tener particiones desmontadas espacio libre.
¡El tercer problema es que tal vez el disco duro esté desmontado! la otra forma es:
2-using statvfs structure.

de nuevo, con esta estructura, puede tener montado el espacio libre de hdd. el código que estoy usando:

#include <stdio.h>
#include <sys/statvfs.h>
int main(int argc, const char *argv[])
{

    const unsigned int GB = (1024 * 1024) * 1024;
    struct statvfs buffer;
    int ret = statvfs(argv[1], &buffer);

    if (!ret) {
        const double total = (double)(buffer.f_blocks * buffer.f_bsize) / GB;
        const double available = (double)(buffer.f_bfree * buffer.f_bsize) / GB;
        const double used = total - available;
        const double usedPercentage = (double)(used / total) * (double)100;
        printf("Total: %f --> %.0f\n", total, total);
        printf("Available: %f --> %.0f\n", available, available);
        printf("Used: %f --> %.1f\n", used, used);
        printf("Used Percentage: %f --> %.0f\n", usedPercentage, usedPercentage);
    }
    return ret;
}

He visto este enlace: Obtenga espacio libre de HDD en Linux
pero las salidas de stat no son similares a los números que veo en la salida del comando df.
Estoy usando Qt y mi sistema operativo es ubuntu 18.04.
cuando ejecuto este código obtengo esto:

[email protected]:~/projects/cpptest/build-cpptest-Desktop-Debug$ ./cpptest .
Total: 31.570432 --> 32
Available: 15.594684 --> 16
Used: 15.975748 --> 16.0
Used Percentage: 50.603513 --> 51

y la salida de mi df es así:

[email protected]:~$ df -H ~/projects/cpptest/build-cpptest-Desktop-Debug
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        32G   16G   14G  54% /

EDITAR:

[email protected]:~/projects/cpptest/build-cpptest-Desktop-Debug$ ./cpptest .
Total: 31.570432 --> 32
Available: 13.967569 --> 14
Used: 17.602863 --> 17.6
Used Percentage: 55.757435 --> 56

avatar de usuario
bruno

no das los resultados que tienes, así que puedo ver dos razones:

Primero puede ser que tenga un desbordamiento al hacer buffer.f_blocks * buffer.f_bsize y buffer.f_bfree * buffer.f_bsize porque su unsigned long están en 32b, así que por ejemplo:

const double total = ((double) buffer.f_blocks) * buffer.f_bsize / GB;
const double available = ((double) buffer.f_bfree) * buffer.f_bsize / GB;

segundo para d.f. 1Gb es 1000*1000*1000 más bien que 1024*1024*1024

Si ejecuto su versión en mi PI4 de 2 Gb, obtengo:

[email protected]:/tmp $ ./a.out .
Total: 3.338009 --> 3
Available: 0.439247 --> 0
Used: 2.898762 --> 2.9
Used Percentage: 86.841044 --> 87
[email protected]:/tmp $ 

después de la modificación para evitar el desbordamiento me sale

[email protected]:/tmp $ ./a.out .
Total: 27.338009 --> 27
Available: 16.439247 --> 16
Used: 10.898762 --> 10.9
Used Percentage: 39.866699 --> 40
[email protected]:/tmp $ 

tiempo df -H . da :

[email protected]:/tmp $ df -H .
Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur
/dev/root           30G     12G   17G  42% /

pero

[email protected]:/tmp $ bc
30*1000*1000*1000/1024/1024/1024
27
[email protected]:/tmp $ 

  • Cambié esas dos líneas pero no difería. y también reemplazó el valor de GB y sigue siendo el mismo. tal vez haya un problema con las cosas que dije sobre los discos duros desmontados. mientras pruebo doy este camino: /dev/sda..Creo que hay algo mal con eso.

    – fa7eme

    19 de julio de 2020 a las 10:47

  • Vi tu cm editado ahora. Entonces, ¿está diciendo que este código proporciona almacenamiento gratuito de HDD correctamente? Entonces, ¿por qué las salidas son extrañas en mi sistema?

    – fa7eme

    19 de julio de 2020 a las 10:50

  • @fatemehheydari no nos das la salida que tienes ni la salida que da d.f., y no tengo una bola de cristal mágica para adivinar todo eso. ¿Estás en un Ubuntu 64b para tener 64b? unsigned long ? Globalmente, sí, para mí, los resultados están bien, incluso las pequeñas rondas realizadas por d.f.

    –bruno

    19 de julio de 2020 a las 10:56


  • mi ubuntu es 64b. Agregué esos resultados a la pregunta.

    – fa7eme

    19 de julio de 2020 a las 11:01

  • el resultado no es extraño (fue en mi caso por desbordamiento) solo 14 en lugar de 16, puede ser d.f. utiliza otra forma de obtener el tamaño disponible?

    –bruno

    19 de julio de 2020 a las 11:17


¿Ha sido útil esta solución?