我正在寻找在 Linux 上运行的 C++ 中创建一个函数,如果 CDRom 媒体是 DVD,则返回 true,如果是其他任何东西(例如音频 CD),则返回 false。
我一直在ioctl
使用linux/cdrom.h
. 我尝试使用,DVD_READ_STRUCT
但它总是返回 true。也许我使用不正确。
dvd_struct s
if (ioctl(hDEV, DVD_READ_STRUCT, &s)) {
return true;
}
看/proc/sys/dev/cdrom/info
,它包含如下内容:
CD-ROM information, Id: cdrom.c 3.20 2003/12/17
drive name: sr0
drive speed: 125
drive # of slots: 1
Can close tray: 1
Can open tray: 1
Can lock tray: 1
Can change speed: 1
Can select disk: 0
Can read multisession: 1
Can read MCN: 1
Reports media changed: 1
Can play audio: 1
Can write CD-R: 1
Can write CD-RW: 1
Can read DVD: 1
Can write DVD-R: 1
Can write DVD-RAM: 1
Can read MRW: 0
Can write MRW: 0
Can write RAM: 1
(它由内核更新并在所有发行版中可用)除了ioctl
来自cdrom.h
. 还请记住,这cdrom.h
是一种创建标准接口的尝试,它尚未满足所有制造商的需求,有些制造商仍在使用 SCSI 代码或其他一些专有方案。因此,为了安全起见,您还应该至少使用 SCSIioctl
代码进行检查 -#include <scsi/...
确保它们可用。
官方文档更有帮助。您必须在调用之前指定请求类型和任何必需的输入ioctl
。
// Is it a DVD?
dvd_struct ds;
ds.type = DVD_STRUCT_PHYSICAL;
ds.physical.layer_num=0;
result = ioctl(drive, DVD_READ_STRUCT, &ds);
if (result == -1) {
perror("Probably not a DVD: ");
} else {
printf("Layer 0: %i to %i.\n", ds.physical.layer[0].start_sector, ds.physical.layer[0].end_sector);
}
真正有趣的东西需要发出 SCSI 命令,例如dvd+rw-tools、cdrkit和cdrdao。但是,这样做有点痛苦,如果您不需要知道光盘是否可刻录、可重写或已按下,则没有必要。