DADiskEject вызывает проблемы с кодом ошибки 12 (kDAReturnUnsupported)
Я пытаюсь извлечь внешние USB-накопители и образы дисков после размонтирования в следующей функции обратного вызова:
void __unmountCallback(DADiskRef disk, DADissenterRef dissenter, void *context )
{
...
if (!dissenter)
{
DADiskEject(disk,
kDADiskEjectOptionDefault,
__ejectCallback,
NULL);
}
}
К сожалению, я получаю ошибку в __ejectCallback...
void __ejectCallback(DADiskRef disk, DADissenterRef dissenter, void * context)
{
if(dissenter)
{
DAReturn status = DADissenterGetStatus(dissenter);
if(unix_err(status))
{
int code = err_get_code(status);
...
}
}
}
Код ошибки 12 означает kDAReturnUnsupported. Я действительно не знаю, что происходит не так. Кто-нибудь может прокомментировать это? Значит ли это, что образы дисков не могут быть извлечены??? Спасибо заранее!!
1 ответ
Документация довольно неясна по этому вопросу. Поэтому неплохо было бы заглянуть в реальный исходный код класса DARequest, чтобы выяснить, что вызывает kDAReturnUnsupported
ответ.
Выявляются следующие условия, которые возвращают kDAReturnUnsupported
ответ:
Ваш экземпляр DADisk представляет весь том или нет?
if ( DADiskGetDescription(disk, kDADiskDescriptionMediaWholeKey) == NULL )
{
status = kDAReturnUnsupported;
}
if ( DADiskGetDescription(disk, kDADiskDescriptionMediaWholeKey) == kCFBooleanFalse )
{
status = kDAReturnUnsupported;
}
Изучив документацию IO Kit (для которой DiscArbitation.framework является оберткой), мы обнаружим, что kDADiskDescriptionMediaWholeKey
описывает, является ли носитель целым или нет (то есть он представляет весь диск или раздел на нем), поэтому убедитесь, что вы извлекаете весь диск, а не раздел. Помните, что вы можете размонтировать раздел, но не можете извлечь его. (это не имеет смысла)
Можно ли монтировать диск?
Еще одно условие в DARequest.c
является ли объем монтируемым или нет, поэтому убедитесь, что это:
if (DADiskGetDescription(disk, kDADiskDescriptionVolumeMountableKey) == kCFBooleanFalse )
{
status = kDAReturnUnsupported;
}
Допустимо ли имя экземпляра DADisk?
Третья проверка проверяет имя тома. Некоторые системные (внутренние) тома не имеют имени и не могут быть извлечены. Проверка очень проста и просто ищет любое имя, так что это не должно иметь большого значения.
if (DARequestGetArgument2(request) == NULL)
{
status = kDAReturnUnsupported;
}
Пройдите эти три проверки и посмотрите, относятся ли они к вам. Таким образом, вы должны выяснить, что не так.