Question

Essayer de lire les formats de disques qui ont été créés en plusieurs sessions à l'aide GetDiskFreeSpaceEx () donne la taille de la dernière session seulement. Comment puis-je lire correctement le nombre et la taille de toutes les sessions en C / C ++?

Merci.

Était-ce utile?

La solution

Vous pouvez regarder le DeviceIoControl fonction API. Voir pour les codes de contrôle. est un exemple de code qui récupère la taille d'un disque CD. Substitut

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

pour par exemple.

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

si vous le souhaitez.

Remarque: La page indique que DeviceIoControl peut être utilisé pour « récupérer des informations sur un lecteur de disquette, disque dur, lecteur de bande ou un lecteur de CD-ROM », mais je l'ai aussi testé sur un DVD, et il semblait fonctionner parfaitement. Je n'ai pas eu accès à tous les DVD multisession pour tester, donc vous devrez tester si vous-même fonctionne. Si cela ne fonctionne pas, je vais essayer quelques-uns des autres codes de contrôle, au moins IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, IOCTL_DISK_GET_DRIVE_LAYOUT_EX, IOCTL_DISK_GET_LENGTH_INFO et IOCTL_DISK_GET_PARTITION_INFO_EX.


Si tout cela échoue avec DeviceIoControl, vous pourriez peut-être utiliser l'API Mastering Image Windows (IMAPI). Vous aurez besoin de l'API v2 (inclus avec Vista et plus tard, peut être ajouté à XP et 2003 aussi, voir ici: Quoi de neuf IMAPIv2) pour le support DVD. Cette API est principalement pour la gravure de CD, mais ne contient peut-être une fonctionnalité pour récupérer la taille du disque, je trouve ça bizarre si elle ne l'a pas. En particulier, ce exemple semble être intéressant. Je ne sais pas si celui-ci fonctionne pour les disques multisession non plus, mais puisqu'il peut les créer, je suppose qu'il est probable.

Voici quelques ressources pour IMAPI:
MSDN - IMAPI
MSDN - interfaces imapi
MSDN - Création de disques multisession avec IMAPI (note: par exemple avec VB, pas C ou C ++)

Autres conseils

Hé, je suis au moins 2 solutions pour vous:

1) Télécharger dvd+rw-mediainfo.exe de http: //fy.chalmers .se / ~ Appro / linux / DVD + RW / outils / win32 / , il est un outil qui lit des informations sur votre disque. Puis juste faire un appel système à partir de votre application et analyser les résultats. Voici un exemple de sortie:

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) Enquêter mciSendString de [DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi)], je pense que vous pouvez envoyer une commande et obtenir les résultats souhaités.

PS: Bien sûr, vous pouvez télécharger les sources de dvd+rw-mediainfo.exe de ici et étudier plus, je viens de vous donner des idées à penser.

UPDATE

Lien vers le code source mis à jour, merci @oystein

Il y a plusieurs façons de le faire depuis les lecteurs de DVD ont plusieurs interfaces pour ce en raison de problèmes existants et de compatibilité descendante.

Vous pouvez envoyer une commande IOCTL_SCSI_PASSTHROUGH_DIRECT sur le DVD-lecteur (la poignée de physicaldevice pour elle). Avec elle, vous émettez une commande SCSI qui seront répondues par le lecteur. Vous pouvez lire les informations de session, informations sur le disque dur capcity et plus. Je crois que les questions de DVD + rw-mediainfo.exe ces.

Unfortunatly, l'interface est un peu délicate et obscure, car il est une commande dans une commande. Th passthrough a un tampon d'octets que vous devrez remplir vous-même avec la structure de commandement.

Ou vous pouvez appeler IOCTL_CDROM_READ_TOC_EX: http://www.osronline.com/ddkx/storage/k306_2cs2.htm

Je crois aussi que l'ensemble exact des IOCTL / commandes qui fonctionneront dépend du lecteur et de son firmaware.

lecteurs plus anciens ne prennent pas en charge les interfaces NEWR et certains des nouveaux lecteurs ne seront pas en charge les interfaces existantes.

Ainsi, quelques-unes des bibliothèques et des outils peut utiliser un ou plusieurs de ces interfaces.

Accseeing les sessons plus âgés est tout assez salissante, vraiment, puisque la plupart des OS ne se soucient d'eux, seuls les plus récentes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top