问题标签 [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 投票
0 回答
2137 浏览

objective-c - 在 mac os x 中以编程方式挂载磁盘映像(DMG)

:如何以编程方式挂载苹果磁盘映像?

我的方法类似于使用磁盘仲裁进行安装,如此处所示。我不喜欢使用任何命令行工具。

卸载和弹出工作完美,但安装需要一个 BSD 名称(通常用于磁盘的块文件)。我也看过DiskArbitrator的源代码,这个工具hdiutil在后台使用来为 DMG 创建块文件。

是否有任何其他方法/框架可以为我的磁盘映像创建块文件,以便我可以使用它来挂载 DMG?

我已经看过这个

0 投票
1 回答
3978 浏览

macos - 如何在 OSX 上迭代所有挂载的文件系统

我有兴趣在 OSX(当前运行 10.9 Mavericks)上迭代所有已挂载的文件系统。我正在寻找类似于 getmntent() 或 mount shell 命令的输出的东西(尽管我想从目标 C 中执行此操作,因此解析 shell 命令的输出显然不是最佳的)。

我一直在研究磁盘仲裁框架,似乎可以使用该框架通知我挂载和卸载事件。我可能在那里遗漏了一些东西,但我不清楚是否有办法使用磁盘仲裁来迭代现有的挂载文件系统。

我已经探索过使用 getfsent(),它似乎可以提供一个解决方案,但经过测试,我发现我没有从迭代 getfsent() 中获得多个条目。请参阅以下代码:

我在这里得到的唯一条目是 / 文件系统。我第二次调用 getfsent() 它返回 NULL,就好像没有更多条目一样。mount 命令显示了其他几个命令,包括已安装的 cifs/smb 文件系统:

所以看起来 getfsent() 开始做我期望的事情,但由于某种原因停止了?

我的问题总结是:在 OSX 上迭代文件系统的最佳方法是什么?

如果有人对为什么我只能从 getfsent() 得到一个结果有答案,我也会对此感兴趣。

0 投票
1 回答
90 浏览

cocoa - 如果应用程序仍在使用某个卷,您如何获得通知?

如果您打开了一个文档并想要卸载一个卷,os x 会打开此警告面板,说明该文档仍在由程序 x 使用。你怎么能在可可中得到关于这个的通知?我尝试了 DADiskArbitration 框架,但是在磁盘成功卸载之前它不会发送回调。

你有什么想法吗?

0 投票
1 回答
197 浏览

macos - 如何获得驱动器正在通电的通知?

我在 OS X 上遇到问题,如果在关闭电源时插入驱动器,然后再打开电源,我不会收到新磁盘出现的通知。如果我插入已经通电的驱动器,我会收到通知。

目前,我正在为磁盘出现、消失或描述通过磁盘仲裁(DARegisterDiskAppearedCallback等)更改时注册回调。我没有看到任何其他可能涵盖驱动器打开情况的回调。

当已插入的驱动器通电时,我如何收到通知?

0 投票
1 回答
1095 浏览

objective-c - 磁盘仲裁目标 C:将所有驱动器和分区放在一个阵列中

我刚刚开始在这个古怪的编程世界中,我遇到了一个非常令人沮丧的问题:

我正在尝试使用磁盘仲裁框架将所有磁盘放入一个数组中。

如您所见,一切正常。问题是我想以某种方式返回“theDisk”对象所以我可以使用它。

由于回调函数是无效的,我不能做一个返回语句。如果我尝试修改函数的返回类型,DARegisterDiskAppearedCallback 函数将无法完全工作。

同样,我在这里的唯一目标是获取有关计算机上所有磁盘和分区的信息并将它们放入一个数组中,以便我可以获取有关它们的信息并对其进行操作。

另外,任何人都可以解释何时将某些内容放入回调函数的“(void *)context”中?Apple文档对此非常模糊......或者我可能完全错过了一些东西

0 投票
1 回答
366 浏览

macos - 使用磁盘仲裁框架时,是否有可靠的方法来知道卷是时间机器卷?

我正在开发一个 OSX 应用程序,除其他外,它会在出现/消失时显示已安装的卷。我使用磁盘仲裁框架来做到这一点。当我将计算机连接到已配置为我的时间机器备份的网络驱动器时,会出现一个名为“时间机器”的卷,即出现设备的 CFDictionary 是这样的:

{DAVolumeMountable=true, DAVolumeNetwork=true, DAVolumeName=timemachine, DAVolumePath=file://localhost/Volumes/timemachine/, DAVolumeKind=afpfs}

我不希望这个卷出现在我的应用程序的 UI 中。我可以用什么标准来知道它真的是一个时间机器体积来排除它?仅使用名称或路径似乎很奇怪。理论上,格式化为名称“timemachine”的驱动器不会安装在相同的名称/路径下吗?

任何建议表示赞赏。

0 投票
1 回答
291 浏览

objective-c - 从 DiskArbitration CFUUID 对象创建字符串

在我的程序中,我DiskArbitration用来检查数据库中的一些值,如果发生某些情况,在它安装之前做一些事情。我正在使用DARegisterDiskPeekCallback这个回调:

我希望能够使用 UUID 并获取一个字符串来检查数据库,但是由于diskProps[@"DAVolumeUUID"]返回的是通用指针而不是CFUUIDRef指针,因此它不允许我运行CFUUIDCreateString(). 我试图将上面的指针转换为CFUUIDRef指针,但出现此错误:Cast of an Objective-C pointer to 'CFUUIDRef *' ... is disallowed by ARC. 如果我不尝试投射,CFUUIDCreateString将不会接受指针。

有没有办法a)将指针转换为CFUUIDRef指针,或b)获取UUID的字符串?

0 投票
1 回答
453 浏览

macos - 磁盘仲裁和确定按钮问题

下面的代码用于获取磁盘列表

OK 按钮的 IBAction 是[self da_tools]

回调函数disk_appeared_callback完美运行并提供正确的信息。

当点击 OK 按钮时,问题发生在CFRunLoopRun() :

  • CFRunLoopRun()需要几秒钟才能执行或永远不会结束。
  • 回调函数 disk_appeared_callback 本身以毫秒为单位执行。

然而,任何对键盘的按键(或在任何地方单击鼠标(有时只是鼠标移动))都会强制CFRunLoopRun()退出,并且回调函数disk_appeared_callback会立即执行。

CFRunLoopRun()被删除da_tools时,在第一次点击 OK 按钮时不会返回任何磁盘信息,但随后点击 OK 按钮会返回正确的磁盘信息。

我试图da_tools在另一个线程中包含:

但这无济于事。

我也尝试发布 keydown 事件,但这也失败了。

如何正确使用CFRunLoopRun

0 投票
1 回答
973 浏览

usb-drive - 将 USB 磁盘 BSD 名称映射到 OSX 中实际安装的驱动器

我正在尝试从 USB 设备 BSD 名称获取该设备的实际安装卷,例如设备的 BSD 名称为“disk2”,并在“/Volumes/USBSTICK”上安装一个 BSD 名称为“disk2s1”的卷。

这是我到目前为止一直在做的事情。使用

我检测到何时添加了驱动器。然后我扫描所有 USB 设备并使用

获取设备的 BSD 名称。

对于我的 U 盘,这将返回“disk2”。跑步

节目

这是有道理的,因为单个 USB 设备可能有多个卷。

我以为我可以使用 DiskArbitration 来找到实际的卷,但是

总是返回一个 NULL 字典。

那么,如何从 USB 设备的 BSD 名称获取该设备的实际安装卷?我想应该可以遍历所有卷,获取它们的 BSD 名称并检查它是否以字符串开头,例如上面的 /Volumes/USBSTICK 是“disk2s1”,但这很麻烦,如果有 disk20 等怎么办?

0 投票
0 回答
644 浏览

objective-c - 如何在可可中挂载本地卷

我有驱动器的 DADiskRef,我想以编程方式将它安装在可可中。这是我尝试安装驱动器的代码。

这里 OnDiskMount 在下面实现

但是,此代码可与 10.9 完美配合,但在 10.10 中启用代码签名时出现问题。