由于我的原问题有点含糊,让我澄清一下。
我的目标是:
- 通过IMAPI选择文件系统后,估计空白光盘的大小
- 估计我的文件在刻录后会占用这张光盘的空间
我想知道的是:
- 是否可以通过编程方式获取所选文件系统的每个扇区的字节数
- 如果不行,IMAPI为不同的文件系统/介质类型使用的每个扇区的默认值是多少,并且这些信息在哪里有记录。
由于我的原问题有点含糊,让我澄清一下。
我的目标是:
我想知道的是:
好的,回答我问题的简短答案是:可以安全地假定 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;
通过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
如果您知道存储卷的空闲/已用块和总大小(忽略已用/空闲空间),那么您可以计算每个块的大小,然后计算出其余部分。
block size = total size / (blocks used + blocks free)
free space = size per block * blocks free
如果你发现块大小不是1K,我会感到惊讶。
DriveInfo
实例获取资源管理器中显示的相同总大小来进行计算。- http://msdn.microsoft.com/en-us/library/system.io.driveinfo.aspx - PhonicUK