我希望在Linux上运行C++创建一个函数,如果CDRom介质是DVD,则返回true,如果其他任何介质(例如音频CD(,则返回false。
我一直在linux/cdrom.h
一起使用ioctl
.我尝试使用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
(它由内核更新,可在所有发行版中使用(除了来自cdrom.h
的ioctl
之外,您还可以使用此信息。还要记住,cdrom.h
是创建标准接口的尝试,它尚未满足所有制造商的需求,有些制造商仍在使用 SCSI 代码或其他一些专有方案。因此,为了安全起见,您还应该至少使用 SCSI ioctl
代码进行检查 - #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。 但是,这样做有点痛苦,如果您不需要知道光盘是可刻录、可重写还是可压制的,则没有必要。