[英]How can I detect if CDRom is a DVD on Linux
我正在尋找在 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
(它由內核更新並在所有發行版中可用)除了來自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 。 但是,這樣做有點痛苦,如果您不需要知道光盤是否可刻錄、可重寫或已按下,則沒有必要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.