我正在编写一个跨平台的应用程序,我需要总的可用磁盘空间.对于posix系统(Linux和Macos),我使用的是statvfs.我创建了这个C方法:
long OSSpecificPosix::getFreeDiskSpace(const char* absoluteFilePath) {
struct statvfs buf;
if (!statvfs(absoluteFilePath,&buf)) {
unsigned long blksize,blocks,freeblks,disk_size,used,free;
blksize = buf.f_bsize;
blocks = buf.f_blocks;
freeblks = buf.f_bfree;
disk_size = blocks*blksize;
free = freeblks*blksize;
used = disk_size - free;
return free;
}
else {
return -1;
}
}
不幸的是,我得到了一些我无法理解的奇怪价值观.例如:
f_blocks = 73242188
f_bsize = 1048576
f_bfree = 50393643
…
这些值是以位,字节还是其他形式存在的?我在这里读取stackoverflow那些应该是字节,但后来我得到的总字节数是免费的:
f_bsize * f_bfree = 1048576 * 50393643
但这意味着49212.542GB ……太多了……
最佳答案
我不太清楚OSX是否足以预测这绝对是答案,但f_blocks和f_bfree实际上是指“基本块”或“片段”(大小为buf.f_frsize字节),而不是“文件系统块大小” (这是buf.f_bsize字节):
http://www.opengroup.org/onlinepubs/009695399/basedefs/sys/statvfs.h.html