空白 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) 上的可用空间的主要内容,如果未能解决你的问题,请参考以下文章