2012-09-14 66 views
8

由於我原來的問題太含糊,讓我澄清一下。空白的DVD /藍光光盤上的可用空間(IMAPI)

我的目標是:

  1. 通過IMAPI
  2. 選擇文件系統估計空間,我的文件將在光盤上的消耗,如果我燒後估計空白光盤的大小。

我想知道什麼:

  1. 是否有可能獲取選定的文件系統每扇區字節編程
  2. 如果不是,是否有每哪個IMAPI使用的扇區字節數默認值不同的文件系統/媒體類型,並在某處記錄。
+2

爲什麼不WMI的選擇? – PhonicUK

+0

@ S.L。巴斯,我不這麼認爲。 –

+0

@ PhonicUK,過去的經驗:)如果沒有其他方法,我會使用它。我希望通過IMAPI獲得這些值,tbh。 –

回答

4

好的,所以我的問題的簡短答案是:一個可以saf假設,DVD/BD盤的扇區大小= 2048字節。

的原因,爲什麼我在我的調試會話獲取不同的尺寸,是因爲在代碼中的錯誤,這檢索部門統計:)的

提到代碼塊從http://www.codeproject.com/Articles/24544/Burning-and-Erasing-CD-DVD-Blu-ray-Media-with-C-an copypasted,所以以防萬一即時發佈快速修復。

原代碼:

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; 
0

如果您知道空閒/使用的塊和存儲卷的總大小(忽略使用/可用空間),那麼您可以計算每塊的大小,然後解決其餘部分。

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

我會感到驚訝,如果你發現了塊大小比其他任何1K雖然

+0

但事情是 - 我不知道總大小。這就是爲什麼我需要扇形尺寸。所以我可以乘以扇區數並獲得以字節爲單位的空閒/已用/總空間。至少多數民衆贊成是我想出了> _> –

+0

而不是,它不是1K。我調整了我的應用程序與各種媒體類型和塊大小從2048到4096不等(我通過查看總大小手動計算這些,在Windows資源管理器中顯示) –

+0

只需使用DriveInfo實例獲取相同的總大小顯示在資源管理器中做計算。 - http://msdn.microsoft.com/en-us/library/system.io.driveinfo.aspx – PhonicUK

0
+0

哦,我完全錯過了這個界面:S只要我有機會,我會盡力弄清楚如何使用它並報告結果。 :) CHeers。儘管如此,如果some1可以共享代碼示例 - 那真的很不錯。 –

+0

如msdn上所述:「在寫入期間檢索每個扇區使用的字節數,返回的值表示先前使用IWriteEngine2 :: put_BytesPerSector設置的值,並且不會爲媒體返回每扇區值的當前字節數。」所以,這個屬性服務於不同的目的。 –