如何在 MacOS (sierra-catalina) 上为分区获取可用空间
Posted
技术标签:
【中文标题】如何在 MacOS (sierra-catalina) 上为分区获取可用空间【英文标题】:How to get available free space for a partition on MacOS (sierra-catalina) 【发布时间】:2020-04-28 06:56:30 【问题描述】:尝试获取每个分区的可用磁盘空间,我在网上找到了许多解决方案,但不幸的是,它们都不起作用。
问题是:如何以编程方式获取给定分区的可用(空闲)空间?
我尝试了什么:
#include <filesystem>
int main()
std::filesystem::path diskPath("/dev/disk0s1");
size_t space = std::filesystem::space(diskPath).available;
std::cout << "Free space for disk01: " << space << std::endl;
不幸的是,我收到以下编译错误:
'path' is unavailable: introduced in macOS 10.15
'path' has been explicitly marked unavailable here
我知道boost
中有一个类似的库,但我想尽可能避免使用 boost。
(针对 10.12 +)
#include <sys/statvfs.h>
int main()
struct statvfs buf;
if (!statvfs("/dev/disk0s1", &buf))
size_t space = buf.f_bfree*buf.f_bsize;
std::cout << "Free space for disk01: " << space << std::endl;
else
std::cerr << "Error here" << std::endl;
不幸的是,这会为所有分区检索0
。注意:像f_bsize
这样的一些值是正确填写的,但f_bfree
总是0
。
【问题讨论】:
【参考方案1】:来自this std::filesyste::space
reference:
确定有关文件系统的信息路径名 p 所在的文件系统
[强调我的]
这意味着您提供的路径必须是文件系统本身的文件或目录,而不是设备文件的路径。
例如,如果/dev/disk0s1
被挂载为/home
,那么您可以使用该挂载路径本身(即std::filesystem::space("/home")
)。
请注意,statvfs
的工作原理完全相同。
【讨论】:
感谢您的来信。这告诉我,即使我可以使用std::filesystem
,它也无济于事。但是如何获得可用空间?
@AdrianMaire 为什么没有帮助?这就像任何 POSIX 系统中的 df
命令一样工作:您将路径传递给已安装文件系统(或安装路径本身)上的文件。是你没有挂载路径的问题吗?
因为 std::filesystem 不受支持。
@AdrianMaire 啊,我明白了。然后请阅读链接的statvfs
参考。您需要提供挂载文件系统的路径,而不是设备文件。
感谢您的回答。但是,我所拥有的是设备(例如disk0s3
)而不是安装的文件路径。仅考虑已挂载的分区(我知道检查未挂载磁盘上的可用空间是不切实际的),您将如何找到给定磁盘的挂载路径?以上是关于如何在 MacOS (sierra-catalina) 上为分区获取可用空间的主要内容,如果未能解决你的问题,请参考以下文章