我正在编写跨平台应用程序,我需要可用磁盘空间总量。对于 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
实际上指的是“基本 block ”或“片段”(大小为 buf.f_frsize
字节),而不是“文件系统 block 大小”(即 buf.f_bsize
字节):
http://www.opengroup.org/onlinepubs/009695399/basedefs/sys/statvfs.h.html
f_bsize
只是提示 I/O 操作的首选大小,它与文件系统的划分方式无关。
关于c++ - 如何获取 Posix 系统中的总可用磁盘空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3899894/