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

10

由于我的原问题有点含糊,让我澄清一下。

我的目标是:

  1. 通过IMAPI选择文件系统后,估计空白光盘的大小
  2. 估计我的文件在刻录后会占用这张光盘的空间

我想知道的是:

  1. 是否可以通过编程方式获取所选文件系统的每个扇区的字节数
  2. 如果不行,IMAPI为不同的文件系统/介质类型使用的每个扇区的默认值是多少,并且这些信息在哪里有记录。

2
为什么WMI不是一个选项? - PhonicUK
@S.L. Barth,我不这么认为。 - Nikita B
1
@HenkHolterman 您忘记了 R 和 RW 媒体(CD-R/CD-RW/DVD-R/DVD+R/DVD-RW) - Dai
1
由于ISO 9660通过将CD-ROM分成逻辑块来工作,因此这些块的大小也可以在主卷描述符中找到。 - PhonicUK
@Nik 你是对的 - 我误读了问题。 - S.L. Barth
显示剩余4条评论
3个回答

4

好的,回答我问题的简短答案是:可以安全地假定 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。然而,正确的freeMediaBlocks数量应该是2,295,104。我是否漏掉了什么? - shahram kalantari

1

哦,我完全错过了这个接口:S。只要有机会,我就会尝试弄清楚如何使用它并报告结果。:)干杯。不过,如果有人能分享一些代码示例-那真是太好了。 - Nikita B
根据MSDN上的说明:“检索在写入期间每个扇区要使用的字节数。返回的值指示先前使用IWriteEngine2 :: put_BytesPerSector设置的值,并且不返回介质的当前每扇区字节数值。” 因此,此属性具有不同的目的。 - Nikita B

0

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

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

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


但问题是 - 我不知道总大小。这就是为什么我需要扇区大小的原因。这样我就可以将其乘以扇区计数,以获取字节中的空闲/已用/总空间。至少这就是我想出来的 >_> - Nikita B
不,它不是1k。我用各种媒体类型调试了我的应用程序,块大小从2048到4096不等(我手动计算了那些值,通过查看Windows资源管理器中显示的总大小)。 - Nikita B
只需使用 DriveInfo 实例获取资源管理器中显示的相同总大小来进行计算。- http://msdn.microsoft.com/en-us/library/system.io.driveinfo.aspx - PhonicUK
正如我之前提到的,DriveInfo对于光盘并不起作用。有时候它会起作用,但大多数情况下,IsReady属性会返回false。而且,它显然不支持空白光盘。让我编辑一个原始问题,以使我的问题更清晰明了。 - Nikita B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接