在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获取磁盘的具体信息,过滤掉非可移动磁盘卷之后,
可移动磁盘拔插,结果如下:
以上已经可以成功枚举到当前电脑上外接的可移动存储设备了,现在要把这些设备格式化为HFS+,在开发文档上找了好久都没有答案,只发现一个终端的格式化命令diskutil
格式化命令为diskutil eraseVolume HFS+ 卷标 磁盘路径,如diskutil eraseVolume HFS+ poet /dev/disk2将会把磁盘/dev/disk2格式化卷标为poet文件系统为HFS+的磁盘,最后用system执行命令
格式化后打印出信息:
最后一个问题就是磁盘的安全退出问题。正常退出磁盘是弹出属性窗口安全推出磁盘,但是怎么通过程序控制呢,在说明文档里找到了DADiskUnmount函数
const char* pdisk = [strDisk UTF8String];
DADiskRef disk = DADiskCreateFromBSDName(kCFAllocatorDefault, session, pdisk);
DADiskUnmount(disk, kDADiskUnmountOptionForce,
unmount_done, NULL);
这时候磁盘确实可以安全退出了
还有个问题没有解决,用GCD处理的多线程在多个磁盘格式化的时候发现还是一个个去格式化的,然而GCD这部分是没有问题的,应该是格式化函数处理时的问题,暂时也找不到可以代替的方案的。。。杯具。。。