我正在尝试使用磁盘仲裁框架在我的Cocoa应用程序中卸载卷.
致电之前:
DADiskUnmount(disk,
kDADiskUnmountOptionDefault,
unmountCallback,
self );
Run Code Online (Sandbox Code Playgroud)
我注册了一个后来调用的回调函数:
void unmountCallback(DADiskRef disk, DADissenterRef dissenter, void *context )
{
if (dissenter != NULL)
{
DAReturn ret = DADissenterGetStatus(dissenter);
switch (ret) {
case kDAReturnBusy:
printf("kDAReturnBusy\n");
break;
}
}
Run Code Online (Sandbox Code Playgroud)
在这个函数中,我尝试解释反对者返回值但是卡住了.我认为它应该是DAReturn类型并且具有类似kDAReturnBusy的值但是当例如iTunes正在使用该卷并且它无法卸载时"ret"具有值0xc010,我不太明白.
如果卸载失败,我想找出无法卸载卷的原因,以及其他应用程序使用它时提醒用户关闭此应用程序.
我有一个长期运行的任务,在已安装的USB驱动器上执行一系列文件操作,我想阻止用户在发生这种情况时从Finder(或其他地方)弹出驱动器.有一个取消按钮,允许任务随时结束.
我曾假设在任务期间保持文件句柄在已安装的卷上打开可以解决问题,但它没有奏效.
这是我尝试的(删除错误处理):
NSString *tempFilePath = @"/Volumes/myVolume/.myTempFile";
if ([[NSFileManager defaultManager] fileExistsAtPath:tempFilePath] == NO) {
[[NSFileManager defaultManager] createFileAtPath:tempFilePath contents:nil attributes:nil]
}
_tempFile = [NSFileHandle fileHandleForWritingAtPath:tempFilePath];
Run Code Online (Sandbox Code Playgroud)
有关我可以采取哪些措施以确保防止卷弹出的任何想法?
当您对应用程序进行沙盒处理时,似乎没有权利使用DVD驱动器.
有没有人想出一种方法来访问它,特别是磁盘仲裁通知?
我有兴趣在OSX上迭代所有挂载的文件系统(目前运行10.9 Mavericks).我正在寻找类似于getmntent()或mount shell命令的输出(尽管我想从目标C中执行此操作,因此解析shell命令的输出显然不是最佳的).
我一直在查看磁盘仲裁框架,看来我可以使用此框架通知mount和unmount事件.我可能在那里遗漏了一些东西,但我不清楚是否有办法使用磁盘仲裁迭代现有的已安装文件系统.
我已经探索过使用getfsent(),它似乎会提供一个解决方案,但经过测试后我发现我没有从迭代getfsent()获得多个条目.请参阅以下代码:
struct fstab* fsentry;
setfsent();
fsentry = getfsent();
while(fsentry)
{
//do something with fsentry
fsentry = getfsent();
}
endfsent();
Run Code Online (Sandbox Code Playgroud)
我到这里的唯一条目是/ file系统.第二次调用getfsent()时,它返回NULL,好像没有更多的条目.mount命令向我展示了其他几个包括已安装的cifs/smb文件系统:
/dev/disk0s2 on / (hfs, local, journaled)
devfs on /dev (devfs, local, nobrowse)
map -hosts on /net (autofs, nosuid, automounted, nobrowse)
map auto_home on /home (autofs, automounted, nobrowse)
//user@<ip address>/public on /Volumes/public (smbfs, nodev, nosuid, mounted by user)
Run Code Online (Sandbox Code Playgroud)
所以似乎getfsent()开始做我期望的,但由于某种原因停止?
总结我的问题是:在OSX上迭代文件系统的最佳方法是什么?
如果有人对我为什么只从getfsent()获得一个结果的答案,我也会对此感兴趣.
我使用磁盘仲裁框架来管理各种驱动器和磁盘.
我已经注册了回调函数DADiskAppearedCallback和DADiskDisappearCallback.
对于usb驱动器,所有设备似乎都运行良好,但对于CD/DVD,我遇到了问题.
CD/DVD加载后,我已DADiskUnmount()使用磁盘的BSDName 卸载()驱动器.然后在对磁盘进行一些验证后,我DADiskMount()再次使用BSDName mount()磁盘.
当我再次安装CD/DVD时,默认应用程序设置在
系统偏好 - >硬件 - > Cds和DVS
没有上手.
例如.对于视频DVD - 打开DVD播放器.DVD播放器应该在这里推出.
请提供任何克服此问题的建议.
谢谢
我仍然在寻找解决方案,"SystemUIServer"管理应该在插入CD/DVD时安装的应用程序.我可以在CD/DVD装载上触发该操作吗?或者这是在CD/DVD装载上手动启动用户提供的应用程序的正确方法吗?
我有一个文件路径列表.这些路径可能会导致未安装的卷上的文件.在尝试访问文件之前,如何以编程方式告诉操作系统安装卷?
我知道这可能是某种方式,因为iTunes似乎做到了.例如,如果我开始播放位于iTunes中未安装的网络附加卷上的歌曲,则会自动为我安装音量.
如果我尝试以指定路径以编程方式打开文件,操作系统是否应该自动为我安装卷?或者我是否需要使用磁盘仲裁框架或类似方法手动安装驱动器?
如果我需要使用磁盘仲裁框架,具体需要做什么?
问:如何以编程方式安装苹果磁盘映像?
我的做法是类似于使用磁盘仲裁安装如图所示这里.我不想使用任何命令行工具.
卸载和弹出工作完美,但挂载需要BSD名称(通常用于磁盘块文件).我也看过DiskArbitrator的源代码,这个工具hdiutil在后台用于为DMG创建块文件.
是否有任何其他方法/框架为我的磁盘映像创建块文件,以便我可以使用它来挂载DMG?
我已经看到了这个
我正在开发一个应用程序,它可以检测卸载存储器或从USB强行拔出可移动存储器时发生的事件.我怎样才能收到这些活动?
我已经看到NSWorkspace了第一种顺利卸载设备的可能性,但是这个类有-unmountAndEjectDeviceAtPath:卸载设备的方法.有人能指出一些检测未安装卷的示例代码吗?
我有一个分区的路径.如何在不使用终端命令的情况下以编程方式检索该分区的UUID?一个例子会更有帮助.
我正在尝试在 OSX 中卸载磁盘。代码工作正常,但是只有在出现错误时,磁盘卸载成功时才会调用回调。我阅读了 DiskArbitrationProgGuide 并按照步骤操作,但尚未取得任何进展。有人可以帮我吗?
@interface DriverUtilitiesController()
void unmount_done(DADiskRef disk,
DADissenterRef dissenter,
void *context);
@end
+ (void)umnountDrivePath:(NSString *)voulumePath
{
DASessionRef session = DASessionCreate(kCFAllocatorDefault);
CFURLRef path = CFURLCreateWithString(NULL, (__bridge CFStringRef)voulumePath, NULL);
DADiskRef disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, session, path);
DADiskUnmount(disk, kDADiskUnmountOptionDefault, unmount_done, NULL);
CFRelease(disk);
}
#pragma mark - Unmount Callback
void unmount_done(DADiskRef disk,
DADissenterRef dissenter,
void *context)
{
NSLog(@"Inside unmount_done");
if (dissenter)
{
// Unmount failed. //
NSLog(@"Unmount failed.");
} else {
NSLog(@"Unmounted Volume");
}
}
Run Code Online (Sandbox Code Playgroud)
正在更新。感谢 Ken Thomases,代码现在可以运行了
- (id)init
{ …Run Code Online (Sandbox Code Playgroud) IOKit和DiskArbitration框架可以告诉我很多关于mac上挂载卷的事情,但它们似乎无法区分HFS +和HFS标准卷.
由于IOKit/DA键Content,DAVolumeKind并且DAMediaContent总是Apple_HFS和两个HFS标准和HFS +卷HFS.
diskutil和DiskUtility.app 可以区分,但我似乎没有Apple开源.
ps statfs(2)没有区分
diskarbitration ×11
macos ×9
objective-c ×4
cocoa ×3
mount ×2
volume ×2
bsd ×1
c++ ×1
cddvd ×1
dmg ×1
iokit ×1
nsworkspace ×1
posix ×1
sandbox ×1
uuid ×1