问题标签 [diskarbitration]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
313 浏览

macos - OSX-Mounting DVD 以编程方式不启动用户指定的应用程序

我使用磁盘仲裁框架来管理各种驱动器和磁盘。

我已经注册了回调函数DADiskAppearedCallbackDADiskDisappearCallback.

对于 USB 驱动器,一切似乎都可以正常工作,但对于 CD/DVD,我遇到了问题。

加载 CD/DVD 后,我DADiskUnmount()使用磁盘的 BSDName 卸载()驱动器。然后在对磁盘进行一些验证后,我DADiskMount()使用 BSDName 再次安装()磁盘。

当我再次挂载 CD/DVD 时,在

系统偏好->硬件->Cds & DVSs

没有启动。

例如。对于视频 DVD - 打开 DVD 播放器。这里应该启动 DVD 播放器。

我该如何克服这个问题?

我仍在寻找遇到的解决方案,“SystemUIServer”管理应在插入 CD/DVD 时挂载的应用程序。我可以在 CD/DVD 安装上触发该操作吗?或者这是在 CD/DVD 挂载上手动启动用户提供的应用程序的正确方法吗?

0 投票
1 回答
515 浏览

objective-c - 将 NSArray 转换为 CFStringRef *

我需要一种将NSArray转换为与DADiskMountWithArguments的参数选项兼容的空终止列表的方法。

该文档将参数选项指定为类型的“空终止列表” CFStringRef arguments[]

我创建了一个 Mount 方法,我想通过参数传递一个NSArray,并且在我的方法中我需要将NSArray转换为 CFStringRef *。

我已经尝试过自己,但我总是遇到 ARC 的麻烦,而且我还没有找到任何好的方法来做到这一点。

我查看了 GitHub https://github.com/aburgh/Disk-Arbitrator/blob/master/Source/Disk.m中的 Disk-Arbitrator 项目以获取灵感,该应用程序的创建者使用此方法:

但这在 ARC 中是不允许的,我找不到办法。

更新以获得更好的清晰度:

这一行:

给出以下错误消息:

ARC 不允许将非 Objective-C 指针类型“void *”隐式转换为“__strong id *”

指向没有明确所有权的非常量类型“id”的指针。

为了解决这个问题,我尝试这样做:

然后这一行:

给出以下错误:

[错误] ARC 不允许将 Objective-C 指针隐式转换为“__unsafe_unretained id *”

[警告]不兼容的指针类型将“__string id”发送到“__unsafe_unretained id *”类型的参数

-getObjects:range:的声明如下所示:

因此,从我收到的错误消息中,我假设我必须将“__unsafe_unretained id *”传递给“getObjects:(id [])aBuffer”。所以要解决这个问题,我将我的 id 声明为 __unsafe_unretained,如下所示:

并像这样更新这一行:

现在我没有任何错误,但是在调用DADiskMountWithArguments 时,我收到以下错误:

ARC 不允许将 Objective-C 指针转换为“CFStringRef *”(又名“const struct __CFString **”)

所以在这里我卡住了,因为我无法修复这个错误,我不知道我之前是否犯了错误,或者我没有找到正确的方式发送 CFStringRef,因此我决定在这里寻求指导。

这是它在上下文中的样子,其中 args 是之前声明的NSArray

所以我的问题是,如何使这种方法对 ARC 友好,或者是否有另一种/更好的方法可以从NSArray到以 NULL 结尾的 CFStringRef *

0 投票
1 回答
144 浏览

objective-c - 在回调方法中枚举磁盘时 DiskRef 消失

我在我正在处理的项目中使用了 GitHub 上的Disk-Arbitrator项目中的 DiskArbitration 类。

我正在通过hdiutil有时为DARegisterDiskDescriptionChangedCallback崩溃定义的回调方法安装/卸载 OS X 安装程序磁盘映像,因为磁盘列表在枚举时发生了变化,然后 get 传递的 diskref 变为NULL.

这是回调调用的函数:

我通过复制和枚举解决了枚举时变异的问题。

但是,此代码有时会崩溃:"*** CFHash() called with NULL ***"

那是因为磁盘已经消失并且diskRef可能已被释放。

所以,我需要一些提示。我想尝试制作 的副本diskRef,并通过以下方式尝试:

但这也不起作用。有没有其他方法可以复制?还是有另一种方法我应该解决这个问题。

0 投票
1 回答
1155 浏览

objective-c - 使用 DiskArbitration 在 OSX 中卸载磁盘

我正在尝试在 OSX 中卸载磁盘。代码工作正常,但只有在出现错误时,磁盘卸载成功时才会调用回调。我阅读了 DiskArbitrationProgGuide 并按照步骤操作,但还没有进展。有人可以帮我吗?

更新。感谢 Ken Thomases,代码现在可以工作了

0 投票
1 回答
293 浏览

cocoa - 卸载驱动器/卷而不弹出

我想在不弹出的情况下卸载磁盘。为此,我尝试了以下代码

这段代码来自这个问题,感谢@zeFree

它可以工作,但我想要卷的动态路径,在代码中它是静态的。我尝试将 NSString 更改为 CFStringRef,然后尝试在 path("/volumes/Untitled") 提及的地方使用,但它仍然相同。

欢迎任何建议。

0 投票
0 回答
315 浏览

macos - Mac App Sandbox 和 USB 设备卸载

我需要在沙盒应用程序中卸载 Objective-C 中的 USB 设备。

对于卸载,我使用:

来自磁盘仲裁。

在我激活沙盒之前一切正常。使用沙盒卸载 (DiskUnmountCallback) 返回失败。

我找不到设备卸载的沙盒权利设置,也找不到该问题的任何其他原因。

在授权中,我激活了“com.apple.security.device.usb”,但我仍然无法卸载 USB 设备。

0 投票
2 回答
316 浏览

macos - Thunderbolt 驱动器在磁盘仲裁/iokit 中未标记为可弹出,尽管它们显然是

我正在开发一个应用程序,它使用磁盘仲裁来找出哪些设备连接到机器并对连接/断开事件做出反应,并且多年来一直运行良好。就在最近,我发现在使用外部 Thunderbolt 驱动器时某些东西无法按预期工作,我对此进行了调试,发现卷的可弹出属性(映射到 kIOMediaEjectableKey i IOKit 的磁盘仲裁中的 kDADiskDescriptionMediaEjectableKey)设置为 false。但是,驱动器显示时带有弹出按钮。

finder 使用什么来确定此卷是否可弹出?显然不是明显的 kDADiskDescriptionMediaEjectableKey。

任何提示表示赞赏。

0 投票
1 回答
483 浏览

macos - 以编程方式获取 OSX Fusion Drive 信息

我正在开发一个项目,该项目将驱动器(及其相关的统计信息,例如由 显示的那些iostat)和分区链接到挂载点,但在 OS X 处理Fusion Drive的方式上遇到了问题。

我已经能够从IO Registry and Disk Arbitration Framework收集有关驱动器和分区的信息。同样,我已经能够使用statfs(或mountordf命令)关联驱动器和挂载点。但是,Fusion Drive 进入图片时缺少一个链接。这是一个示例输出diskutil list

iostat来自(读取/写入/读取的字节数/写入的字节数,传输花费的时间等)的 IORegistry 统计信息与disk0上述输出相关联。但是,df(或等效的编程 statfs 函数)将/挂载点与/dev/disk1

我希望能够将文件系统上的读/写/与物理驱动器相关联disk0。我花了几个小时在这里和其他地方寻找disk1disk0s2. 的源代码diskutil显然在DiskManagement框架中,不公开。

除了以文本方式解析上述diskutil list命令的输出之外,还有什么方法可以将已安装的(虚拟)融合驱动器与其底层(物理)分区相关联?

0 投票
1 回答
574 浏览

macos - 在 DiskArbitration 框架中取消注册回调的正确语法

我将实现一个观察者,以便在特定卷消失时得到通知。

中的通知NSWorkspace不是一个选项,因为我需要有关设备关闭而不是设备卸载的通知。

注册很容易(我省略了错误处理)

回调闭包是


注销方法

需要一个泛型UnsafeMutableRawPointer而不是特定的回调类型之一。

当我将回调闭包传递给callback我得到的参数时

无法将类型“DADiskDisappearedCallback”(又名“@convention(c)(DADisk,可选)-> ()”)的值转换为预期的参数类型“UnsafeMutableRawPointer”

我的问题是:如何将回调对象转换volumeDidDisappearCallbackUnsafeMutableRawPointer

0 投票
1 回答
66 浏览

macos - 有没有办法在从外部设备启动时保持内部驱动器段的卸载

对于使用本机 Mac 应用程序对驱动器和/或段进行取证成像,我从外部设备(usb、hdd 等)启动到 BaseSystem。我想在引导过程中保持内部驱动器和/或段未挂载(在引导之前无法知道驱动器/段卷名和/或 UUID)。稍后将禁用磁盘仲裁,挂载这些驱动器/段并对其进行映像。

我创建了一个用于挂载阻塞(在外部引导设备上)的守护进程(System/Library/LaunchDeamons),但它只阻止新连接的设备,而不是内部设备。

注 1:我从 Sierra (10.12.1) 的 BaseSystem.dmg 创建了启动映像,并修改了内容。

注意 2:由于在引导之前无法知道驱动器/段卷名称和/或 UUID,因此无法使用 fstab。

我需要一个方向,任何评论可能会有所帮助。谢谢。