簡體   English   中英

如何在 Linux 上檢測 CDRom 是否是 DVD

[英]How can I detect if CDRom is a DVD on Linux

我正在尋找在 Linux 上運行的 C++ 中創建一個函數,如果 CDRom 媒體是 DVD,則返回 true,如果是其他任何東西(例如音頻 CD),則返回 false。

我一直在使用ioctllinux/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.hioctl之外,您還可以使用此信息。 還要記住, 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-toolscdrkitcdrdao 但是,這樣做有點痛苦,如果您不需要知道光盤是否可刻錄、可重寫或已按下,則沒有必要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM