c++ - 如何在 MacOS (sierra-catalina) 上为分区获取可用空间
问题描述
试图获得每个分区的可用磁盘空间,我在网上找到了许多解决方案,不幸的是它们都不起作用。
问题是:如何以编程方式获取给定分区的可用(空闲)空间?
我尝试了什么:
#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
,但如果可能的话,我想避免提升。
(针对 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
.
解决方案
确定有关路径名 p 所在文件系统的信息
[强调我的]
这意味着您提供的路径必须是文件系统本身的文件或目录,而不是设备文件的路径。
例如,如果/dev/disk0s1
安装为,/home
那么您可以使用该安装路径本身(即std::filesystem::space("/home")
)。
请注意,它的statvfs
工作原理完全相同。
推荐阅读
- html - 尝试使用 R 从网页中抓取商业网站
- mysql - 错误:连接 ECONNREFUSED 127.0.0.1:3306(数据库未在节点 js 中与 mysql 连接)
- javascript - ejs <%- body %> 正文未定义
- assembly - 将内存地址而不是值移动到寄存器中
- excel - Excel VBA:如何将文本添加到特定列中的空白单元格,然后循环到下一个空白单元格并添加文本?
- arrays - 使用 for 循环时什么更有效?
- android - 使用 Material Design Theme 进行片段隔离测试
- computer-vision - MediaPipe TensorflowLite 虹膜模型
- firebase - 判断文档是由 Cloud Function 删除还是由经过身份验证的用户删除
- apache-spark - 可以删除底层镶木地板文件而不会对 DeltaLake _delta_log 产生负面影响