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

objective-c – 如何在cocoa应用程序中获取diskutil信息输出,第1张

概述有没有办法以编程方式获得与diskutil info / |相同的信息grep“自由空间”给你? (出于显而易见的原因,我宁愿有更好的方法来解决这个命令的结果.) 目前我正在使用statfs;但是,我注意到这个报告的空间并不总是准确的,因为OS X还会在驱动器上放置临时文件,例如Time Machine快照.如果空间不足,这些文件将自动删除, *** 作系统不会报告这些文件的使用情况.换句话说,statf 有没有办法以编程方式获得与diskutil info / |相同的信息grep“自由空间”给你? (出于显而易见的原因,我宁愿有更好的方法来解决这个命令的结果.)

目前我正在使用statfs;但是,我注意到这个报告的空间并不总是准确的,因为OS X还会在驱动器上放置临时文件,例如Time Machine快照.如果空间不足,这些文件将自动删除, *** 作系统不会报告这些文件的使用情况.换句话说,statfs通常提供比diskutil信息更少的可用空间或查看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).

UPDATE

我看了一下otool -L $(哪个diskutil)的输出,看起来它正在使用一个名为diskManagement.framework的私有框架.看完类转储的输出后,我看到有一个volumeFreeSpaceFordisk:error:方法.我从diskutil -info /和FSMegaInfo FSGetVolumeInfo /和我的工具获得的大小是:

> diskutil:427031642112字节
>我的工具:volumeFreeSpaceFordisk:427031642112
> FSMegaInfo:freeBytes = 427031642112(397 GB)

我还观察到,每次运行其中一个工具时,大小都不同(有几KB),而且diskutil除以1000,FSMegaInfo除以1024,因此GB的大小总是不同的(原因与df -h和df -H和diskutil – base 10和base 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\u0026gt;来获取diskManagement.h. diskManagement.h,您可以通过使用-F / System / library / PrivateFrameworks /和add -framework包含私有框架路径来链接到该框架.

编译:

clang -g tool.m -F/System/library/PrivateFrameworks/ -framework Foundation -framework diskarbitration -framework diskManagement -o tool

UPDATE2:
您还可以查看here和here.如果FSMegaInfo示例不适合您,那么您可以统计/Volumes/.MobileBackups并从statfs(“/”,& stats)中获取它的大小.

总结

以上是内存溢出为你收集整理的objective-c – 如何在cocoa应用程序中获取diskutil信息输出全部内容,希望文章能够帮你解决objective-c – 如何在cocoa应用程序中获取diskutil信息输出所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1004216.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存