gpt4 book ai didi

objective-c - 如何在 cocoa 应用程序中获取 diskutil 信息输出

转载 作者:太空狗 更新时间:2023-10-30 04:00:58 32 4
gpt4 key购买 nike

有没有办法以编程方式获取与 diskutil info/| 相同的信息? grep "Free Space" 给你? (出于显而易见的原因,我宁愿有更好的方法来执行此操作,而不仅仅是解析该命令的结果。)

目前我正在使用statfs;但是,我注意到此报告的空间并不总是准确的,因为 OS X 还会在驱动器上放置临时文件,例如 Time Machine 快照。如果空间用完,这些文件会自动删除,并且操作系统不会报告这些文件的使用情况。换句话说,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 的私有(private)框架。查看 class-dump 的输出后,我看到有一个 volumeFreeSpaceForDisk:error: 方法。所以我从 diskutil -info/FSMegaInfo FSGetVolumeInfo/ 和我的工具得到的大小是:

  • diskutil:427031642112 字节

  • 我的工具:volumeFreeSpaceForDisk: 427031642112

  • FSMegaInfo:freeBytes = 427031642112 (397 GB)

我还观察到,每次我运行其中一种工具时,大小都不同(几 KB),而且 diskutil 除以 1000,FSMegaInfo 除以 1000到 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;
}

您可以通过运行 class-dump/System/Library/PrivateFrameworks/DiskManagement.framework/Versions/Current/DiskManagement > DiskManagement.h 获取 DiskManagement.h 和您可以通过使用 -F/System/Library/PrivateFrameworks/ 包含私有(private)框架路径并添加 -framework 来链接到该框架。

编译:

clang -g tool.m -F/System/Library/PrivateFrameworks/ -framework Foundation -framework DiskArbitration -framework DiskManagement -o tool

更新 2:也可以看看herehere .如果 FSMegaInfo 示例不适合您,那么您可以只stat /Volumes/.MobileBackups 并从您得到的内容中减去它的大小来自 statfs("/", &stats)

关于objective-c - 如何在 cocoa 应用程序中获取 diskutil 信息输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20678752/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com