C++ 如何在Windows中读取多会话DVD光盘大小?

C++ 如何在Windows中读取多会话DVD光盘大小?,c++,winapi,diskspace,cddvd,C++,Winapi,Diskspace,Cddvd,尝试使用GetDiskFreeSpaceEx()读取在多个会话中创建的磁盘的大小只会给出上一个会话的大小。如何正确读取C/C++中所有会话的数量和大小 谢谢。嘿,我至少为您提供了两种解决方案: 1) 从下载dvd+rw mediainfo.exefrom,它是一个读取光盘信息的工具。然后从应用程序中进行系统调用并解析结果。以下是示例输出: D:\Downloads>"dvd+rw-mediainfo.exe" f: INQUIRY: [HL-DT-ST][DV

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


谢谢。

嘿,我至少为您提供了两种解决方案:

1) 从下载
dvd+rw mediainfo.exe
from,它是一个读取光盘信息的工具。然后从应用程序中进行系统调用并解析结果。以下是示例输出:

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:当然,你可以下载dvd+rw mediainfo.exe的源代码并进一步调查,我只是给你一些想法

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

您可能想看看API函数。有关控制代码,请参阅。是检索CD磁盘大小的代码示例。替代品

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

CreateFile(TEXT("\\\\.\\F:") /* Drive is F: */
如果你愿意的话

注意:页面上说
设备控制
可用于“检索有关软盘驱动器、硬盘驱动器、磁带驱动器或CD-ROM驱动器的信息”,但我也在DVD上对其进行了测试,它似乎工作得很好。我没有访问任何要测试的多段DVD,所以您必须自己测试这是否有效。如果它不起作用,我会尝试其他一些控制代码,至少是
IOCTL\u DISK\u GET\u DRIVE\u GEOMETRY\u EX
IOCTL\u DISK\u GET\u DRIVE\u LAYOUT\u EX
IOCTL\u DISK\u GET\u LENGTH\u INFO
IOCTL\u DISK\u GET\u PARTITION\u INFO\u EX。

如果DeviceIoControl的所有操作都失败,则可以使用Windows映像主控API(IMAPI)。您需要2版API(包括Vista和更高版本,也可以添加到XP和2003,请参见此处:)以获得DVD支持。这个API主要用于CD刻录,但可能包含一些检索磁盘大小的功能,如果没有,我会觉得很奇怪。特别是,这个例子似乎很有趣。我不知道这种方法是否适用于多会话磁盘,但由于它可以创建多会话磁盘,我想这是可能的

以下是IMAPI的一些资源:



(注意:以VB为例,而不是C或C++)

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

您可以将IOCTL\u SCSI\u PASSTHROUGH\u DIRECT命令发送到DVD驱动器(该驱动器的物理设备句柄)。通过它,您可以发出SCSI命令,该命令将由驱动器响应。您可以读取会话信息、磁盘信息、磁盘容量等。 我相信dvd+rw-mediainfo.exe会解决这些问题

不幸的是,接口有点棘手和模糊,因为它是命令中的一个命令。这个passthrough有一个字节缓冲区,您必须用命令结构填充自己

或者您可以调用IOCTL\u CDROM\u READ\u TOC\u EX:

我还认为,IOCTL/命令的确切设置取决于驱动器及其固件

较旧的驱动器将不支持newr接口,而一些较新的驱动器将不支持旧接口

因此,一些库和工具可能会使用其中一个或多个接口


因为大多数操作系统都不关心它们,只关心最新的操作系统,所以看到老版本的sesson真的很麻烦

你想知道每个会话的大小,还是只是整个磁盘的大小?OP显然是从C++和WinAPI发布的,不需要给P/Cube。如果你再次阅读我的评论,你会发现我的PS在源代码中查看。我不读cpp,只是想帮忙。像你这样的混蛋只是在玩弄任何好的意图,这是mkisofs的来源,而不是你发布的程序。你可能想编辑你的帖子,我认为你的答案值得奖励。