【问题标题】:how to get hdd's free space如何获得硬盘的可用空间
【发布时间】:2020-11-08 17:39:10
【问题描述】:

我想通过 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;
这种方式有一些问题。
首先,我不喜欢使用命令,因为它会变得很复杂,它会充满相互转换的类型。像要浮动的字符串和... 其次是使用运行命令,我不能有未挂载的分区可用空间。
第三个问题是硬盘本身可能被卸载! 另一种方式是:
2-using statvfs structure.
同样,使用这种结构,您可以安装硬盘的可用空间。 我正在使用的代码:

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

我看过这个链接:Get free space of HDD in linux
但是 stat 的输出与我在 df 命令输出中看到的数字不同。
我正在使用 Qt,我的操作系统是 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

【问题讨论】:

    标签: c++ storage hard-drive linux-disk-free


    【解决方案1】:

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

    首先可能是您在执行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 $ 
    

    【讨论】:

    • 我改变了这两行,但没有什么不同。并且还替换了GB的值,仍然相同。也许我所说的关于未安装的硬盘的事情有问题。在测试时,我给出了这条路径:/dev/sda.。我认为这有问题。
    • 我现在看到了你编辑的厘米。所以你是说这段代码正确地提供了硬盘的免费存储空间?那为什么我的系统上的输出很奇怪?!
    • @fatemehheydari 你没有给我们你的输出,也没有 df 给出的输出,我没有魔法水晶球来猜测所有这些。您是否在 Ubuntu 64b 上拥有 64b unsigned long ?在全球范围内,对我来说,结果还可以,即使是 df 进行的小回合
    • 我的 ubuntu 是 64b。我将这些输出添加到问题中。
    • 结果不是 wierd (在我的情况下是因为溢出)只有 14 而不是 16,可能是 df 使用了其他方式获得可用尺寸?
    猜你喜欢
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    相关资源
    最近更新 更多