目前我正在使用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信息输出所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)