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

Disk Arbitration 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

Disk Arbitration(またはDiskArb)フレームワークAPIを探しています。

于 2010-09-15T19:32:45.340 に答える