在 osx 上将已安装的卷识别为 CD/DVD

Posted

技术标签:

【中文标题】在 osx 上将已安装的卷识别为 CD/DVD【英文标题】:Identify a mounted volume as a CD/DVD on osx 【发布时间】:2012-02-03 13:20:48 【问题描述】:

当你在 osx 上挂载任何东西时,它会显示在 /Volumes/mountname 下

有什么方法可以使用命令行或 C/C++ 将卷识别为 CD/DVD ROM?

我目前最好的想法是这样的。

df | grep mountname 

获取 /dev/diskNsM 路径

然后

drutil | grep /dev/diskN 

查看路径挂载的设备是否为刻录机。

这可行,但我担心 CD/DVD 不是刻录机的情况。它还会出现在 drutil 的输出中吗? Mac 甚至还附带非刻录 CD/DVD 驱动器吗?

我更喜欢使用 C、C++ 或 Objective C 来做到这一点。

我已经用过了

const char *tmp = '/Volumes/mysterydrive';
statfs(tmp, &m);
if(m.f_flags & MNT_RDONLY)

    read_only = true;

判断卷是否为只读, 但我看不到这个或任何相关的调用是否可以区分 CD/DVD 和只读安装的卷。

它只需要适用于 OSX 10.5 和更新版本。

有什么想法吗?

编辑:

使用

  diskutil info /Volumes/mysterydrive

如果是 CD/DVD,我得到以下输出

  Optical Drive Type:       CD-ROM, CD-R, CD-RW, DVD-ROM, DVD-R, DVD-R DL, DVD-RW, DVD+R, DVD+R DL, DVD+RW
  Optical Media Type:       DVD-R
  Optical Media Erasable:   No

这就是我所需要的!

我稍后会考虑使用 IOKit 以编程方式执行此操作,但这似乎是完成它的最快方法。

【问题讨论】:

【参考方案1】:

您可以从

获得最详细的信息
diskutil info /Volume/foo

特别是查看 Optical DriveOptical Media 条目,这些条目只能用于 CD/DVD,因此非常可靠。

不幸的是,diskutil 用来获取所有信息的框架是私有的,因此很难在 C 代码中复制它。

我没有深入研究其他选项,但是由于您可以从statfs 获取磁盘名称,因此理论上可以使用IOKit 来检查设备,您会看到IOCDMediaIODVDMedia 类,如果它是 CD/DVD 驱动器(即,如果您查找 IO*Media 类,BSD Name 属性的磁盘名称类似于 disk6

【讨论】:

【参考方案2】:

Apple Developer Central 有一个名为 CDROMSample 的示例代码项目,该项目显示使用 IOKit 例程访问 CD-ROM 属性。这也可能让您开始处理 DVD。

【讨论】:

以上是关于在 osx 上将已安装的卷识别为 CD/DVD的主要内容,如果未能解决你的问题,请参考以下文章

vmware 10使用心得记录

在没有媒体 (CD/DVD) 的 Windows XP SP3 上安装 IIS

遍历已安装的卷以查找特定的文件类型

检查链接是不是有效,如果没有在视觉上将其识别为已损坏

Mac 上的 Docker 机器:在 docker 主机/docker 机器上看不到已安装的卷?卷物理存储在哪里?

安装Windows7系统时,提示:缺少所需的CD/DVD驱动器设备驱动程序