如何在Windows中读取多会话DVD磁盘大小?

时间:2010-10-24 08:58:12

标签: c++ winapi diskspace cddvd

尝试使用GetDiskFreeSpaceEx()读取在多个会话中创建的磁盘大小,仅提供上一个会话的大小。如何正确读取C / C ++中所有会话的数量和大小?

感谢。

3 个答案:

答案 0 :(得分:3)

您可能希望查看DeviceIoControl API函数。有关控制代码,请参阅hereHere是一个检索CD磁盘大小的代码示例。替代

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

例如。

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

如果你愿意的话。

注意:该页面显示DeviceIoControl可用于“检索有关软盘驱动器,硬盘驱动器,磁带驱动器或CD-ROM驱动器的信息”,但我他们也在DVD上测试过,它看起来效果很好。我无法访问任何多区段DVD进行测试,因此您必须测试自己是否有效。如果它不起作用,我会尝试其他一些控制代码,至少IOCTL_DISK_GET_DRIVE_GEOMETRY_EXIOCTL_DISK_GET_DRIVE_LAYOUT_EXIOCTL_DISK_GET_LENGTH_INFOIOCTL_DISK_GET_PARTITION_INFO_EX

<小时/> 如果所有都失败了DeviceIoControl,您可以使用Windows Image Mastering API(IMAPI)。您需要v2的API(包含在Vista&amp;稍后,也可以添加到XP&amp; 2003中,请参见此处:What's new in IMAPIv2)以获得DVD支持。这个API主要用于CD刻录,但可能包含一些用于检索磁盘大小的功能,如果没有,我会发现它很奇怪。特别是,this示例似乎很有趣。我不知道这个是否适用于多会话磁盘,但由于它可以创建它们,我想这很可能。

以下是IMAPI的一些资源:
MSDN - IMAPI
MSDN - IMAPI interfaces
MSDN - Creating multisession disks with IMAPI(注意:使用VB的示例,而不是C或C ++)

答案 1 :(得分:1)

嘿,我至少为你找到了两个解决方案:

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)从mciSendString调查[DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi)],我怀疑你可以发送一些命令并获得所需的结果。

PS:当然,您可以从here下载dvd+rw-mediainfo.exe来源并进一步调查,我只想给您一些想法。

更新

更新源代码链接,谢谢@oystein

答案 2 :(得分:0)

有许多方法可以做到这一点,因为DVD驱动器由于遗留和向后兼容性问题而具有多个接口。

您可以将IOCTL_SCSI_PASSTHROUGH_DIRECT命令发送到DVD驱动器(它的物理设备句柄)。有了它,您将发出一个将由驱动器应答的SCSI命令。您可以读取会话信息,磁盘信息磁盘容量等。 我相信dvd + rw-mediainfo.exe会发布这些内容。

不幸的是,界面有点棘手和模糊,因为它是命令中的命令。传递有一个字节缓冲区,您必须使用命令结构填写。

或者您可以拨打IOCTL_CDROM_READ_TOC_EX: http://www.osronline.com/ddkx/storage/k306_2cs2.htm

我也相信IOCTL /命令的确切设置取决于驱动器及其固件。

较旧的驱动器不支持较新的接口,而某些较新的驱动器不支持传统接口。

因此,一些图书馆和工具可能会使用这些接口中的一个或多个。

考虑到旧的sessons是非常混乱,真的,因为大多数操作系统不会关心它们,只有最新的。