Domanda

Il tentativo di leggere i formati di dischi che sono stati creati in sessioni multiple utilizzando GetDiskFreeSpaceEx () dà la dimensione del solo l'ultima sessione. Come faccio a leggere correttamente il numero e le dimensioni di tutte le sessioni in C / C ++?

Grazie.

È stato utile?

Soluzione

Si potrebbe desiderare di guardare il DeviceIoControl funzione API. Vedere qui per i codici di controllo. Qui un esempio di codice che recupera la dimensione di un disco CD. Sostituire

CreateFile(TEXT("\\\\.\\PhysicalDrive0")

per es.

CreateFile(TEXT("\\\\.\\F:") /* Drive is F: */

se lo si desidera.

Nota: La pagina dice che DeviceIoControl può essere usato per "recuperare informazioni su un disco floppy, unità disco rigido, unità nastro, o CD-ROM", ma ho anche provato su un DVD, e sembrava funzionare perfettamente. Io non avere accesso ai vostri DVD multisessione di prova, in modo dovrete prova se stessi che funziona. Se non funziona, mi piacerebbe provare alcuni degli altri codici di controllo, almeno IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, IOCTL_DISK_GET_DRIVE_LAYOUT_EX, IOCTL_DISK_GET_LENGTH_INFO e IOCTL_DISK_GET_PARTITION_INFO_EX.


Se tutto fallisce con DeviceIoControl, si potrebbe fare uso delle API di Image Mastering di Windows (IMAPI). Avrete bisogno v2 delle API (incluso con Vista e in seguito, può essere aggiunto a XP e 2003 troppo, vedi qui: Cosa c'è di nuovo in IMAPIv2 ) per il supporto DVD. Questa API è principalmente per la masterizzazione di CD, ma che forse contiene alcune funzionalità per il recupero dimensione del disco, avrei trovato strano se non lo ha fatto. In particolare, questo esempio sembra essere interessante. Non so se questo funziona per multisessione dischi sia, ma dal momento che può crearle, credo che sia probabile.

Ecco alcune risorse per IMAPI:
MSDN - IMAPI
MSDN - IMAPI interfacce
MSDN - Creazione di dischi con multisessione IMAPI (nota: ad esempio con VB, non C o C ++)

Altri suggerimenti

Hey ho ottenuto almeno 2 soluzioni per voi:

1) Scarica dvd+rw-mediainfo.exe da http: //fy.chalmers .it / ~ appro / linux / DVD + RW / strumenti / win32 / , è uno strumento che legge informazioni sul tuo disco. Poi basta fare una chiamata di sistema dalla tua app e analizzare i risultati. Qui di output di esempio:

D:\Downloads>"dvd+rw-mediainfo.exe" f:
INQUIRY:                [HL-DT-ST][DVDRAM GT30N    ][1.01]
GET [CURRENT] CONFIGURATION:
 Mounted Media:         10h, DVD-ROM
 Current Write Speed:   1.0x1385=1385KB/s
 Write Speed #0:        8.0x1385=11080KB/s
 Write Speed #1:        4.0x1385=5540KB/s
 Write Speed #2:        2.0x1385=2770KB/s
 Write Speed #3:        1.0x1385=1385KB/s
 Speed Descriptor#0:    00/2292991 R@8.0x1385=11080KB/s W@8.0x1385=11080KB/s
READ DVD STRUCTURE[#0h]:
 Media Book Type:       01h, DVD-ROM book [revision 1]
 Legacy lead-out at:    2292992*2KB=4696047616
READ DISC INFORMATION:
 Disc status:           complete
 Number of Sessions:    1
 State of Last Session: complete
 Number of Tracks:      1
READ TRACK INFORMATION[#1]:
 Track State:           complete
 Track Start Address:   0*2KB
 Free Blocks:           0*2KB
 Track Size:            2292992*2KB
 Last Recorded Address: 2292991*2KB
FABRICATED TOC:
 Track#1  :             17@0
 Track#AA :             17@2292992
 Multi-session Info:    #1@0
READ CAPACITY:          2292992*2048=4696047616

2) Indagare mciSendString da [DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi)], ho il sospetto è possibile inviare dei comandi e ottenere i risultati desiderati.

PS: naturalmente è possibile scaricare i sorgenti dvd+rw-mediainfo.exe da qui e indagare ulteriormente, sto solo dando idee a cui pensare.

UPDATE

Link al codice sorgente aggiornato, grazie @oystein

Ci sono molti modi per fare questo in quanto le unità DVD hanno diverse interfacce per questo a causa di questioni di eredità e indietro-compatibilità.

Si potrebbe inviare un comando IOCTL_SCSI_PASSTHROUGH_DIRECT al DVD-drive (la maniglia physicaldevice per esso). Con esso si emette un comandi SCSI che verranno elaborate dal drive. È possibile leggere le informazioni di sessione, disco informazioni capcity disco e altro ancora. Credo che il DVD + RW questioni-mediainfo.exe questi.

Purtroppo, l'interfaccia è un po 'complicato e oscuro, dal momento che è un comando all'interno di un comando. Th passthrough ha un byte di buffer si dovrà compilare in te stesso con la struttura di comando.

In alternativa, è possibile chiamare IOCTL_CDROM_READ_TOC_EX: http://www.osronline.com/ddkx/storage/k306_2cs2.htm

Credo anche che l'insieme esatto del IOCTL / comandi che il lavoro volontà dipende sul disco e la sua firmaware.

unità meno recenti non supportano le interfacce newr e alcune delle unità più recenti non supportano interfacce legacy.

In questo modo, alcune delle librerie e strumenti potrebbe usare una o più di queste interfacce.

Accseeing le sessons anziani è tutto molto disordinato, in realtà, poiché la maggior parte del sistema operativo non si cura di loro, solo quelli più recenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top