Свободное место на чистых дисках DVD / Blu-Ray (IMAPI)
Поскольку мой первоначальный вопрос был слишком расплывчатым, позвольте мне уточнить.
Мои цели:
- оценить размер чистого диска после выбора файловой системы через IMAPI
- оценить место, которое мой файл будет занимать на этом диске, если я его запишу.
Что я хотел бы знать:
- Можно ли программно получить байты на сектор для выбранной файловой системы
- Если нет, то есть ли значение по умолчанию для байтов на сектор, которое IMAPI использует для разных файловых систем / типов носителей, и задокументировано ли оно где-нибудь.
3 ответа
Итак, короткий ответ на мой вопрос: можно смело предположить, что размер сектора для дисков 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
Я был бы удивлен, если бы вы обнаружили, что размер блока был чем-то отличным от 1К, хотя