批量格式化磁盘为HFS+

在windows系统上可以通过format或SHFormat等方法实现磁盘的格式化,但是这些方式并不支持格式化为HFS+。在MAC上有自带的磁盘管理工具可以格式化磁盘为HFS+,今天来模拟一下,并处理一下多个设备同时格式化的问题。
OS X开发在国内网站根本找不到什么资料,只能求助于苹果官方文档,搜索关于disk的资料,找到了DiskArbitration相关资料。
可以通过向系统注册消息回调来监听磁盘事件,如磁盘挂载,出现,消失等等

- (void)viewDidLoad {
    [super viewDidLoad];

    diskNameArray = [[NSMutableArray alloc]init];
    session = DASessionCreate(kCFAllocatorDefault);//创建一个新的会话//kCFAllocatorDefault=null;

    DARegisterDiskAppearedCallback(session, kDADiskDescriptionMatchVolumeMountable, hello_disk, NULL);//注册一个回调函数称为每当一个磁盘已经出现了。
    DARegisterDiskDisappearedCallback(session, kDADiskDescriptionMatchVolumeMountable, goodbye_disk, NULL);//注册一个回调函数称为每当一个磁盘已经消失了。
DARegisterDiskMountApprovalCallback(session,NULL,Mount_diskmount,NULL);//注册一个回调函数被称为磁盘时已经探测。
    DARegisterDiskUnmountApprovalCallback(session, NULL, unMount_diskmount, NULL);//注册一个回调函数的调用,每当一个卷卸载。
    DARegisterDiskDescriptionChangedCallback(session, NULL, NULL, DiskDescription, NULL);
    DARegisterDiskPeekCallback(session,NULL,0,diskpeek,NULL);//注册一个回调函数被调用时要安装卷。

    DASessionUnscheduleFromRunLoop(session, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
    CFRelease(session);
}

DADissenterRef Mount_diskmount(DADiskRef disk, void *context){

    printf("disk %s 磁盘卷中\n", DADiskGetBSDName(disk));
    return NULL;
}

DADissenterRef unMount_diskmount(DADiskRef disk, void *context){

    printf("disk %s 磁盘卷卸载中\n", DADiskGetBSDName(disk));

    return NULL;

}

void DiskDescription( DADiskRef disk,CFArrayRef keys,void *context){

    printf("disk changed%s", DADiskGetBSDName(disk));
}

void diskpeek(DADiskRef disk, void *context){

    printf("disk %s 磁盘安装卷中\n", DADiskGetBSDName(disk));

}

通过DADiskCopyDescription获取磁盘的具体信息,过滤掉非可移动磁盘卷之后,
可移动磁盘拔插,结果如下:
poet


以上已经可以成功枚举到当前电脑上外接的可移动存储设备了,现在要把这些设备格式化为HFS+,在开发文档上找了好久都没有答案,只发现一个终端的格式化命令diskutil
格式化命令为diskutil eraseVolume HFS+ 卷标 磁盘路径,如diskutil eraseVolume HFS+ poet /dev/disk2将会把磁盘/dev/disk2格式化卷标为poet文件系统为HFS+的磁盘,最后用system执行命令
poet
格式化后打印出信息:
poet


最后一个问题就是磁盘的安全退出问题。正常退出磁盘是弹出属性窗口安全推出磁盘,但是怎么通过程序控制呢,在说明文档里找到了DADiskUnmount函数

       const char* pdisk = [strDisk UTF8String];
        DADiskRef disk = DADiskCreateFromBSDName(kCFAllocatorDefault, session, pdisk);
        DADiskUnmount(disk, kDADiskUnmountOptionForce,
                      unmount_done, NULL);

这时候磁盘确实可以安全退出了


还有个问题没有解决,用GCD处理的多线程在多个磁盘格式化的时候发现还是一个个去格式化的,然而GCD这部分是没有问题的,应该是格式化函数处理时的问题,暂时也找不到可以代替的方案的。。。杯具。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

poet_lj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值