有没有办法通过编程获得diskutil info / | grep "Free Space"提供给您的相同信息?(出于明显的原因,我宁愿有更好的方法来实现这一点,而不仅仅是解析该命令的结果。)
目前我正在使用statfs;但是,我注意到,这个报告的空间并不总是准确的,因为os x还将诸如时间机器快照之类的临时文件放在驱动器上。如果空间不足,这些文件会自动被删除,并且操作系统不会报告这些文件的使用情况。换句话说,statfs通常比diskutil info或在finder中查看磁盘信息提供更少的可用空间。

最佳答案

您可以使用popen(3)

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    FILE *f;
    char info[256];

    f = popen("/usr/sbin/diskutil info /", "r");
    if (f == NULL) {
        perror("Failed to run diskutil");
        exit(0);
    }

    while (fgets(info, sizeof(info), f) != NULL) {
        printf("%s", info);
    }

    pclose(f);

    return 0;
}

编辑
对不起,我没有仔细阅读这个问题。您也可以使用Disk Arbitration Framework。还有一些示例代码可能有帮助(FSMegaInfo)。
更新
我查看了otool -L $(which diskutil)的输出,它似乎使用了一个名为DiskManagement.framework的私有框架。在查看了class-dump的输出之后,我发现有一个volumeFreeSpaceForDisk:error:方法。所以我从diskutil -info /FSMegaInfo FSGetVolumeInfo /得到的尺寸和我的工具是:
diskutil:427031642112 Bytes
我的工具:volumeFreeSpaceForDisk: 427031642112
fsmegainfo:freeBytes = 427031642112 (397 GB)
我还观察到,每次运行一个工具时,大小不同(kb),并且diskutil除以1000,FSMegaInfo除以1024,所以GB中的大小将总是不同(与df -hdf -Hdiskutil基10和基2相同的原因)。
这是我的样本工具:
#import <Foundation/Foundation.h>
#import "DiskManagement.h"
#import <DiskArbitration/DADisk.h>

int main(int argc, char *argv[])
{
    int                 err;
    const char *        bsdName = "disk0s2";
    DASessionRef        session;
    DADiskRef           disk;
    CFDictionaryRef     descDict;
    session  = NULL;
    disk     = NULL;
    descDict = NULL;
    if (err == 0) {session = DASessionCreate(NULL); if (session == NULL) {err = EINVAL;}}
    if (err == 0) {disk = DADiskCreateFromBSDName(NULL, session, bsdName); if (disk == NULL) {err = EINVAL;}}
    if (err == 0) {descDict = DADiskCopyDescription(disk); if (descDict == NULL) {err = EINVAL;}}

    DMManager *dmMan = [DMManager sharedManager];
    NSLog(@"blockSizeForDisk: %@", [dmMan blockSizeForDisk:disk error:nil]);
    NSLog(@"totalSizeForDisk: %@", [dmMan totalSizeForDisk:disk error:nil]);
    NSLog(@"volumeTotalSizeForDisk: %@", [dmMan volumeTotalSizeForDisk:disk error:nil]);
    NSLog(@"volumeFreeSpaceForDisk: %@", [dmMan volumeFreeSpaceForDisk:disk error:nil]);

    return 0;
}

您可以通过运行DiskManagement.h获得class-dump /System/Library/PrivateFrameworks/DiskManagement.framework/Versions/Current/DiskManagement > DiskManagement.h,并且可以通过使用-F/System/Library/PrivateFrameworks/和添加-framework的私有框架路径链接到该框架。
编译:
clang -g tool.m -F/System/Library/PrivateFrameworks/ -framework Foundation -framework DiskArbitration -framework DiskManagement -o tool

更新2:
您还可以查看herehere。如果FSMegaInfo样本不为你工作,那么你可以只是stat /Volumes/.MobileBackups并从你从ccc>得到的大小减去它的大小。

08-19 06:15