c++ - 如何获取 Posix 系统中的总可用磁盘空间?

标签 c++ linux macos unix posix

我正在编写跨平台应用程序,我需要可用磁盘空间总量。对于 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_blocksf_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/

相关文章:

linux - 尝试确定如何在命令行模式下在 Wine 上运行 Windows 应用程序

linux - 目录中所有文件内容的总大小

android - Zipalign - 找不到命令 - MAC 终端

ios - UndoManager运行循环分组将如何在不同的线程上下文中受到影响?

java - 如何通过 JNI 设置我的类的 "Double"类型变量的值?

c++ - Qt OSX全屏窗口上层菜单栏和Dock

C 不会将数据放在变量数组中

Ruby:在内存中显示 HTML 文件而不将其保存到磁盘

c++ - 聚合初始化,clang 要我破坏我的代码?

c++ - 如果我获取它的地址,是否保证静态变量是有序的?