如何在 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) 上为分区获取可用空间的主要内容,如果未能解决你的问题,请参考以下文章

macos 如何读取网络版本

macOS - 任何人都知道在为 macOS 编程时如何在 Xcode 中缩放视图?

macos如何快速清理垃圾 macos如何实现快速清理垃圾

如何通过 macOS 恢复功能重新安装 macOS

mac电脑中的macos.app文件如何运行

(SwiftUI, MacOS 11.0) 如何在 SecureTextFeild 中检测焦点?