我遇到了一个程序问题,该程序应该将我发回给任何用户可用的可用磁盘空间。
我的目标是获取任何没有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
的可用空间为sda3
,30G
的可用空间为sda1
这似乎完全不准确。
我一直在使用Stackoverflow上的帖子,混合我看到的解决方案,但没有一个令人满意。如何以可用的可用空间的兆字节获得正确的值?
编辑:完整statvfs
和df /
输出
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% /
答案 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
相反?