Question

Since my original question was a bit too vague, let me clarify.

My goals are:

  1. to estimate blank disc size after selecting filesystem via IMAPI
  2. to estimate space which my file will consume on this disc if i burn it.

What i would like to know:

  1. Is it possible to get bytes per sector for selected file system programmatically
  2. If not, is there default value for bytes per sector which IMAPI uses for different file systems / media types, and is it documented somewhere.
Was it helpful?

Solution

Ok, so the short answer to my question is: one can safely assume, that sector size for DVD/BD discs = 2048 bytes.

The reason, why i was getting different sizes during my debug sessions, was because of an error in code, which retrieved sectors count :)

Mentioned code block was copypasted from http://www.codeproject.com/Articles/24544/Burning-and-Erasing-CD-DVD-Blu-ray-Media-with-C-an , so just in case im posting a quick fix.

original code:

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;

fixed code:

discFormatData = new MsftDiscFormat2Data { Recorder = discRecorder };
fileSystemImage = new MsftFileSystemImage();
fileSystemImage.ChooseImageDefaults(discRecorder);
if (!discFormatData.MediaHeuristicallyBlank)
{
    fileSystemImage.MultisessionInterfaces = discFormatData.MultisessionInterfaces;
    fileSystemImage.ImportFileSystem();
}
Int64 freeMediaBlocks = fileSystemImage.FreeMediaBlocks;

OTHER TIPS

If you know free/used blocks and the total size of the storage volume (ignoring used/free space) then you can calculate the size per block and then work the rest out.

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

I'd be surprised if you found the block size was anything other than 1K though

via IMAPI - IWriteEngine2::get_BytesPerSector

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

This project uses a managed IMAPI2 wrapper to make life easier - http://www.codeproject.com/Articles/24544/Burning-and-Erasing-CD-DVD-Blu-ray-Media-with-C-an

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top