4

我正在寻找在 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;
}
4

2 回答 2

1

/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/...确保它们可用。

于 2019-07-28T22:04:39.120 回答
0

官方文档更有帮助。您必须在调用之前指定请求类型和任何必需的输入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-toolscdrkitcdrdao。但是,这样做有点痛苦,如果您不需要知道光盘是否可刻录、可重写或已按下,则没有必要。

于 2022-01-15T02:53:18.043 回答