如何在Mac OS X上操作期间防止弹出磁盘?

时间:2010-09-15 18:16:06

标签: objective-c macos diskarbitration

我有一个长时间运行的任务,在已安装的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];

有关我可以采取哪些措施以确保无法弹出卷的任何想法?

2 个答案:

答案 0 :(得分:10)

您需要使用Disk Arbitration API,更具体地说是DARegisterDiskUnmountApprovalCallback。

您可以通过DADisk.h

中提供的功能创建DADiskRef

调用回调后,您可以决定是否要阻止撤消。一个人为的例子:

DADissenterRef myUnmountApprovalCallback(DADiskRef disk, void *context)
{
    DADissenterRef result = NULL; // NULL means approval
    if (stillWorking) {
        // This is released by the caller, according to the docs
        result = DADissenterCreate(kCFAllocatorDefault, kDAReturnBusy, CFSTR("<Your App> is busy writing to this device. Please cancel the operation first.");
    }
    return result;
}

如评论中所述,这不会阻止任何人拔出插头,但它会向您提供明确卸载的通知。

答案 1 :(得分:0)

您正在寻找磁盘仲裁(或DiskArb)框架API。