6

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

关于我可以做些什么来确保防止卷弹出的任何想法?

4

2 回答 2

10

您需要使用磁盘仲裁API,更具体地说是 DARegisterDiskUnmountApprovalCallback。

您可以通过DADisk.hDADiskRef中可用的功能创建一个

调用回调时,您可以决定是否要阻止卸载。举一个人为的例子:

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;
}

正如评论中所指出的,这并不能阻止任何人拔掉插头,但它会给你明确卸载的通知。

于 2010-09-15T18:43:48.873 回答
0

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

于 2010-09-15T19:32:45.340 回答