Как я могу предотвратить извлечение диска во время работы в Mac OS X? - PullRequest
6 голосов
/ 15 сентября 2010

У меня есть длительная задача, которая выполняет ряд файловых операций на подключенных USB-накопителях, и я хочу, чтобы пользователи не извлекали диск из Finder (или из других источников), пока это происходит.Существует кнопка «Отмена», которая позволяет завершить задачу в любое время.

Я предполагал, что сохранение дескриптора файла открытым на подключенном томе на время выполнения задачи поможет, но это не так.t сработало.

Это то, что я пробовал (обработка ошибок удалена):

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

_tempFile = [NSFileHandle fileHandleForWritingAtPath:tempFilePath];

Есть идеи о том, что можно сделать, чтобы предотвратить извлечение тома?

Ответы [ 2 ]

10 голосов
/ 15 сентября 2010

Вам нужно будет использовать Дисковый арбитраж API, точнее DARegisterDiskUnmountApprovalCallback.

Вы можете создать DADiskRef с помощью функций, доступных в 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;
}

Как отмечено в комментариях, это не помешает кому-либо просто потянуть вилку, но даст вам уведомление о явном отключении.

0 голосов
/ 15 сентября 2010

Вы ищете API фреймворка Disk Arbitration (или DiskArb).

...