我尝试在以下回调函数中卸载后弹出外部 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。我真的不知道出了什么问题。有人可以对此发表评论吗?这是否意味着无法弹出磁盘镜像??? 提前谢谢了!!
最佳答案
文档对此非常不清楚。因此,查看实际的 source code of the DARequest class 是个好主意。找出导致 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;
}
检查这三项检查,看看它们是否适用于您。这样您一定会发现问题所在。
关于objective-c - DADiskEject 导致问题,错误代码为 12 (kDAReturnUnsupported),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10606817/