如何免费获得硬盘 space

how to get hdd's free space

我想使用 ssh 在远程系统中获得免费的硬盘大小。
我是这样找到的:
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;
这种方式有一些问题。
首先,我不喜欢使用命令,因为它会变得很复杂,它会充满类型之间的转换。像字符串浮动和... 第二个是使用 运行 命令,我不能让卸载的分区空闲 space。
第三个问题是硬盘本身可能被卸载了! 另一种方式是:
2-using statvfs structure.
同样,使用此结构,您可以挂载硬盘的空闲 space。 我正在使用的代码:

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

我看过这个 link:
但是 stat 的输出与我在 df 命令输出中看到的数字不相似。
我正在使用 Qt,我的 os 是 ubuntu 18.04.
当我运行这段代码时,我得到了这个:

heydari.f@swkb-dev2:~/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

我的 df 的输出是这样的:

heydari.f@swkb-dev2:~$ df -H ~/projects/cpptest/build-cpptest-Desktop-Debug
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        32G   16G   14G  54% /

编辑:

heydari.f@swkb-dev2:~/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

你没有给出你的结果,所以我可以看到两个原因:

首先可能是您在执行 buffer.f_blocks * buffer.f_bsizebuffer.f_bfree * buffer.f_bsize 时发生溢出,因为您的 unsigned long 在 32b 上,例如:

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

第二个 df 1Gb 是 1000*1000*1000 而不是 1024*1024*1024

如果我在我的 2Gb PI4 上执行你的版本,我得到:

pi@raspberrypi:/tmp $ ./a.out .
Total: 3.338009 --> 3
Available: 0.439247 --> 0
Used: 2.898762 --> 2.9
Used Percentage: 86.841044 --> 87
pi@raspberrypi:/tmp $ 

修改后避免溢出我得到

pi@raspberrypi:/tmp $ ./a.out .
Total: 27.338009 --> 27
Available: 16.439247 --> 16
Used: 10.898762 --> 10.9
Used Percentage: 39.866699 --> 40
pi@raspberrypi:/tmp $ 

df -H . 给出:

pi@raspberrypi:/tmp $ df -H .
Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur
/dev/root           30G     12G   17G  42% /

但是

pi@raspberrypi:/tmp $ bc
30*1000*1000*1000/1024/1024/1024
27
pi@raspberrypi:/tmp $