获得真正的免费可用空间

时间:2013-04-11 15:04:46

标签: c++ ubuntu diskspace

我遇到了一个程序问题,该程序应该将我发回给任何用户可用的可用磁盘空间。

我的目标是获取任何没有sudo权限的人可以使用的硬盘驱动器每个分区的所有可用磁盘空间。

所以我尝试了这个:

int main() {
    struct statvfs diskData;
    statvfs("/", &diskData);
    unsigned long long available = (diskData.f_favail + diskData.f_bavail) * diskData.f_frsize) / (1024 * 1024)
    std::cout << "Free Space : " << available << std::endl;
}

这给了我总共2810 ......

但是,当我输出df -h时,我可以看到25G的可用空间为sda330G的可用空间为sda1

这似乎完全不准确。

我一直在使用Stackoverflow上的帖子,混合我看到的解决方案,但没有一个令人满意。如何以可用的可用空间的兆字节获得正确的值?

编辑:完整statvfsdf /输出

statvfs

Block Size            : 4 096
Fragment Size         : 4 096
Blocks                : 9 612 197
Free Blocks           : 7 009 166
Non Root Free Blocks  : 6 520 885
Inodes                : 2 444 624
Free Inodes Space     : 2 137 054
Non Root Free Inodes  : 2 137 054
File System ID        : 4 224 884 198
Mount Flags           : 4 096
Max Filename Length   : 255

df /

Filesystem     1K-Blocks      Used           Available      Use%     Mounted on
/dev/sda3      38 448 788     10 412 112     26 083 556     29%      / 

2 个答案:

答案 0 :(得分:3)

这似乎是对可用磁盘空间的更精确测量:

unsigned long long available = (diskData.f_bavail * diskData.f_bsize) / (1024 * 1024);

它在我的系统上非常接近地匹配df的输出(df显示演出中的大小,并且可能对它们进行舍入)。

如果你想在df这样的演出中输出你可以使用它:

#include <sys/statvfs.h>
#include <stdio.h>

unsigned long rounddiv(unsigned long num, unsigned long divisor) {
    return (num + (divisor/2)) / divisor;
}

int main() {
    struct statvfs diskData;
    statvfs("/home", &diskData);
    unsigned long available = diskData.f_bavail * diskData.f_bsize;
    printf("Free Space : %luG\n", rounddiv(available, 1024*1024*1024));
    return 0;
}

我系统上的输出:
Free Space : 31G

如果我运行df -h /home

Filesystem            Size  Used Avail Use% Mounted on
                      181G  141G   31G  83% /home

答案 1 :(得分:1)

似乎正确使用的值是片段大小,而不是块大小(即f_frsize)

你试过

吗?
diskData.f_bavail * diskData.f_frsize

相反?