在Windows中会话DVD磁盘大小?
尝试读取使用GetDiskFreeSpaceEx()在多个会话中创建的磁盘大小只会给出最后一个会话的大小。 如何正确读取C / C ++中所有会话的数量和大小?
谢谢。
您可能需要查看DeviceIoControl API函数。 在这里查看控制代码。 这是一个检索CD磁盘大小的代码示例。 替代
CreateFile(TEXT("\.PhysicalDrive0")
例如
CreateFile(TEXT("\.F:") /* Drive is F: */
如果你希望。
注意:该页面说DeviceIoControl
可以用来“检索关于软盘驱动器,硬盘驱动器,磁带驱动器或CD-ROM驱动器的信息”,但我也在DVD上测试过它,它似乎可以完美工作。 我无法使用任何多区段DVD进行测试,因此您必须测试该功能是否可行。 如果它不起作用,我会尝试一些其他控制代码,至少IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
, IOCTL_DISK_GET_DRIVE_LAYOUT_EX
, IOCTL_DISK_GET_LENGTH_INFO
和IOCTL_DISK_GET_PARTITION_INFO_EX
。
如果所有DeviceIoControl都失败,则可以使用Windows Image Mastering API(IMAPI)。 对于DVD支持,您需要v2的API(包含在Vista及更高版本中,可以添加到XP和2003中,请参阅此处:IMAPIv2中的新增内容)。 这个API主要用于CD刻录,但也许包含一些检索磁盘大小的功能,如果没有,我会发现它很奇怪。 特别是,这个例子似乎很有趣。 我不知道这一个是否适用于多区段磁盘,但是由于它可以创建它们,我猜这很可能。
以下是IMAPI的一些资源:
MSDN - IMAPI
MSDN - IMAPI接口
MSDN - 使用IMAPI创建多区段磁盘(注意:以VB为例,而不是C或C ++)
嘿,我至少得到了2个解决方案:
1)从http://fy.chalmers.se/~appro/linux/DVD+RW/tools/win32/下载dvd+rw-mediainfo.exe
,它是一个读取有关光盘信息的工具。 然后,只需从您的应用程序进行系统调用并解析结果即可。 以下是输出示例:
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)从[DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi)]
调查mciSendString
,我怀疑你可以发送一些命令并获得所需的结果。
PS:当然你可以从这里下载dvd+rw-mediainfo.exe
来源并进一步调查,我只是给你想法。
UPDATE
链接到源代码更新,谢谢@oystein
有很多方法可以做到这一点,因为由于传统和向后兼容性问题,DVD驱动器具有多个接口。
您可以发送一个IOCTL_SCSI_PASSTHROUGH_DIRECT命令到DVD驱动器(它的物理设备句柄)。 借助它,您可以发出将由驱动器应答的SCSI命令。 您可以阅读会话信息,磁盘信息磁盘容量等。 我相信dvd + rw-mediainfo.exe会发出这些问题。
不幸的是,界面有点棘手和模糊,因为它是一个命令中的命令。 Th passhrough有一个字节缓冲区,你将不得不使用命令结构填写你自己。
或者,您可以致电IOCTL_CDROM_READ_TOC_EX:http://www.osronline.com/ddkx/storage/k306_2cs2.htm
我也相信将会工作的IOCTL /命令的确切集合取决于驱动器及其固件。
较旧的驱动器将不支持新的接口,并且一些较新的驱动器将不支持旧版接口。
因此,一些库和工具可能会使用这些接口中的一个或多个。
实际上,观看更老的sessons非常麻烦,因为大多数操作系统都不会关心它们,只是最近的那些。
链接地址: http://www.djcxy.com/p/48505.html