10

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

我的目标是:

  1. 通过 IMAPI 选择文件系统后估计空白磁盘大小
  2. 如果我刻录它,估计我的文件将在这张光盘上消耗的空间。

我想知道的:

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

3 回答 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;
于 2012-09-17T08:12:44.643 回答
0

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

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

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

于 2012-09-14T13:03:00.360 回答
0

通过 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

于 2012-09-14T15:49:17.413 回答