代码之家  ›  专栏  ›  技术社区  ›  rkellerm

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

  •  7
  • rkellerm  · 技术社区  · 14 年前

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

    谢谢。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Oystein    14 年前

    你可能想看看 DeviceIoControl API函数。见 here 用于控制代码。 Here 是检索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映像控制API(IMAPI)。您将需要2版的API(Vista和更高版本附带,也可以添加到XP和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++的例子)

        2
  •  1
  •   St.Woland    14 年前

    嘿,我至少给你两个解决方案:

    1)下载 dvd+rw-mediainfo.exe http://fy.chalmers.se/~appro/linux/DVD+RW/tools/win32/ ,这是一种读取光盘信息的工具。然后从你的应用程序进行系统调用并分析结果。下面是输出示例:

    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光盘 来源于 here 进一步调查,我只是给你一些想法。

    更新

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

        3
  •  0
  •   Dominik Weber    14 年前

    有很多方法可以做到这一点,因为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/命令的确切设置将取决于驱动器及其固件感知。

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

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

    由于大多数操作系统都不关心它们,只关心最近的操作系统,所以看到旧的操作系统都是相当混乱的。