Mac OS Xでの操作中にディスクの排出を防ぐにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3720503

質問

マウントされたUSBドライブで一連のファイル操作を実行する長期にわたるタスクがあり、これが発生している間、ユーザーがファインダー(または他の場所)からドライブを排出しないようにしたいと考えています。タスクをいつでも終了できるようにするキャンセルボタンがあります。

私は、タスクの期間中にマウントされたボリュームでハンドルを開いたままにしておくとトリックが行われると思っていましたが、それは機能していません。

これは私が試したものです(削除されたエラー):

NSString *tempFilePath = @"/Volumes/myVolume/.myTempFile";
if ([[NSFileManager defaultManager] fileExistsAtPath:tempFilePath] == NO) {
    [[NSFileManager defaultManager] createFileAtPath:tempFilePath contents:nil attributes:nil]
}

_tempFile = [NSFileHandle fileHandleForWritingAtPath:tempFilePath];

ボリュームが排出されないようにするために私ができることについて何かアイデアはありますか?

役に立ちましたか?

解決

使用する必要があります ディスク仲裁 API、より具体的にはdaregisterdiskunmountapprovalcallback。

aを作成できます DADiskRef Avaliableで機能を介して Dadisk.H

コールバックが呼び出されたら、アンマウントをブロックするかどうかを決定できます。不自然な例については:

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

コメントで述べたように、これは誰もがプラグを引くことを妨げるものではありませんが、明示的なアンマウントの通知が得られます。

他のヒント

ディスク仲裁(またはディスカーブ)フレームワークAPIを探しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top