空白 DVD/蓝光光盘 (IMAPI) 上的可用空间

Posted

技术标签:

【中文标题】空白 DVD/蓝光光盘 (IMAPI) 上的可用空间【英文标题】:Available space on blank dvd / blu-ray discs (IMAPI) 【发布时间】:2012-09-07 13:12:09 【问题描述】:

由于我最初的问题有点太模糊,让我澄清一下。

我的目标是:

    通过 IMAPI 选择文件系统后估计空白磁盘大小 估计如果我刻录我的文件将在这张光盘上占用的空间。

我想知道的:

    是否可以通过编程方式获取所选文件系统的每个扇区的字节数 如果没有,IMAPI 用于不同文件系统/媒体类型的每个扇区的字节数是否有默认值,是否记录在某处。

【问题讨论】:

为什么不能选择 WMI? @S.L.巴特,我不这么认为。 @PhonicUK,过去的经验 :) 如果没有其他方法,我会使用它。我希望通过 IMAPI 获得这些值,tbh。 @HenkHolterman 你忘记了 R 和 RW 媒体(CD-R/CD-RW/DVD-R/DVD+R/DVD-RW) “由于 ISO 9660 将 CD-ROM 分割成逻辑块,因此这些块的大小也可以在主卷描述符中找到。” 【参考方案1】:

好的,我的问题的简短回答是:可以放心地假设,DVD/BD 光盘的扇区大小 = 2048 字节。

我在调试会话期间获得不同大小的原因是代码中的错误,它检索到的扇区数:)

提到的代码块是从 http://www.codeproject.com/Articles/24544/Burning-and-Erasing-CD-DVD-Blu-ray-Media-with-C-an 复制粘贴的,所以以防万一我发布快速修复。

原代码:

discFormatData = new MsftDiscFormat2Data();
discFormatData.Recorder = discRecorder;
IMAPI_MEDIA_PHYSICAL_TYPE mediaType = discFormatData.CurrentPhysicalMediaType;
fileSystemImage = new MsftFileSystemImage();
fileSystemImage.ChooseImageDefaultsForMediaType(mediaType);
if (!discFormatData.MediaHeuristicallyBlank)

     fileSystemImage.MultisessionInterfaces = discFormatData.MultisessionInterfaces;
     fileSystemImage.ImportFileSystem();

Int64 freeMediaBlocks = fileSystemImage.FreeMediaBlocks;

固定代码:

discFormatData = new MsftDiscFormat2Data  Recorder = discRecorder ;
fileSystemImage = new MsftFileSystemImage();
fileSystemImage.ChooseImageDefaults(discRecorder);
if (!discFormatData.MediaHeuristicallyBlank)

    fileSystemImage.MultisessionInterfaces = discFormatData.MultisessionInterfaces;
    fileSystemImage.ImportFileSystem();

Int64 freeMediaBlocks = fileSystemImage.FreeMediaBlocks;

【讨论】:

我使用的是相同的代码。但就我而言,空 DVD (4.7GB) 的 freeMediaBlocks 返回 681574400,这意味着容量为 650 MB。但是,freeMediaBlock 的正确数量应该是 2,295,104。有什么我想念的吗?【参考方案2】:

如果您知道空闲/已用块和存储卷的总大小(忽略已用/空闲空间),那么您可以计算每个块的大小,然后计算其余部分。

block size = total size / (blocks used + blocks free)
free space = size per block * blocks free

如果你发现块大小不是 1K,我会很惊讶

【讨论】:

但问题是 - 我不知道总大小。这就是为什么我需要扇区大小。所以我可以将它乘以扇区数并获得可用/已用/总空间(以字节为单位)。至少这就是我想出的>_> 不,它不是 1k。我用各种媒体类型调试我的应用程序,块大小从 2048 到 4096 不等(我通过查看总大小手动计算,显示在 Windows 资源管理器中) 只需使用DriveInfo 实例来获得在资源管理器中显示的相同总大小来进行计算。 - msdn.microsoft.com/en-us/library/system.io.driveinfo.aspx 正如我上面提到的 DriveInfo 不适用于光盘。有时确实如此,但大多数时候 IsReady 属性返回 false。而且,显然它不支持空白光盘。让我编辑一个原始问题,让我的问题更清楚。【参考方案3】:

通过 IMAPI - IWriteEngine2::get_BytesPerSector

http://msdn.microsoft.com/en-us/library/windows/desktop/aa832661(v=vs.85).aspx

该项目使用托管 IMAPI2 包装器来简化生活 - http://www.codeproject.com/Articles/24544/Burning-and-Erasing-CD-DVD-Blu-ray-Media-with-C-an

【讨论】:

哦,我完全错过了这个界面:S 一旦我有机会我会尝试弄清楚如何使用它并报告结果。 :) 干杯。尽管如此,如果 some1 可以共享代码示例 - 那将是非常好的。 如 msdn 上所述:“检索写入期间用于每个扇区的字节数。返回值指示先前使用 IWriteEngine2::put_BytesPerSector 设置的值,并且不返回每个扇区的当前字节数媒体的行业价值。”所以,这个属性有不同的用途。

以上是关于空白 DVD/蓝光光盘 (IMAPI) 上的可用空间的主要内容,如果未能解决你的问题,请参考以下文章

IMAPI:如果图像大小超过可用空间,如何获取图像大小而不抛出异常?

DVD Cloner 2019MAC如何使用?

Windows XP 上的 IMAPI2 错误

为啥电脑不能放DVD光盘,总是提示 请将磁盘插入驱动器G

IMAPI界面可以选择刻录模式吗?

如何在空白光盘上刻录东西!?