2012-09-14 15 views
8

Ponieważ moje pierwotne pytanie było trochę zbyt ogólnikowe, pozwól mi wyjaśnić.Dostępne miejsce na pustych dyskach DVD/Blu-ray (IMAPI)

Moje cele to:

  1. oszacować rozmiar pustej płyty po wybraniu systemu plików poprzez IMAPI
  2. oszacować przestrzeń, która pochłonie mój plik na tej płycie, gdybym go spalić.

Co chciałbym wiedzieć:

  1. Czy to możliwe, aby uzyskać bajtów na sektor dla wybranego systemu plików programowo
  2. Jeśli nie, tam jest wartość domyślna dla bajtów na sektor, który IMAPI stosowanego do różne systemy plików/typy nośników i czy jest to gdzieś udokumentowane.
+2

Dlaczego nie WMI to opcja? – PhonicUK

+0

@ S.L. Barth, nie sądzę. –

+0

@PhonicUK, przeszłe doświadczenie :) Będę z niego korzystać, jeśli nie ma innego sposobu. Miałem nadzieję uzyskać te wartości przez IMAPI, tbh. –

Odpowiedz

4

OK, więc krótka odpowiedź na moje pytanie brzmi: można zabezpieczyć Załóżmy, że ten rozmiar sektora dla dysków DVD/BD = 2048 bajtów.

Powodem, dlaczego ja dostawałem różne rozmiary podczas moich sesji debugowania, z powodu błędu w kodzie, które pobierane liczyć sektory :)

Wspomniany blok kod został copypasted z http://www.codeproject.com/Articles/24544/Burning-and-Erasing-CD-DVD-Blu-ray-Media-with-C-an, więc na wszelki wypadek im delegowania szybka naprawa.

oryginalny kod:

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; 

kod stały:

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

Jeśli znasz wolne/używane bloki i całkowity rozmiar woluminu do przechowywania (ignorując używane/wolne miejsce), to możesz obliczyć rozmiar na blok, a następnie wyrównać resztę.

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

byłbym zaskoczony, jeśli okazało się, że rozmiar bloku było coś innego niż 1K chociaż

+0

Ale chodzi o to, że nie znam całkowitego rozmiaru. Właśnie dlatego potrzebuję wielkości sektora. Mogę więc pomnożyć ją przez liczbę sektorów i uzyskać wolną/wykorzystaną/całkowitą przestrzeń w bajtach. Przynajmniej to, co wymyśliłem> _> –

+0

I nie, nie jest to 1k. Debugowałem moją aplikację różnymi typami mediów, a rozmiar bloku zmieniał się od 2048 do 4096 (obliczałem je ręcznie, patrząc na całkowite rozmiary, wyświetlane w eksploratorze Windows). –

+0

Wystarczy użyć instancji 'DriveInfo', aby uzyskać taki sam całkowity rozmiar wyświetlany w eksploratorze wykonaj obliczenia. - http://msdn.microsoft.com/en-us/library/system.io.driveinfo.aspx – PhonicUK

0

poprzez IMAPI - IWriteEngine2 :: get_BytesPerSector

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

Ten projekt wykorzystuje zarządzanego IMAPI2 otoki, aby ułatwić życie - http://www.codeproject.com/Articles/24544/Burning-and-Erasing-CD-DVD-Blu-ray-Media-with-C-an

+0

oh, tęskniłem za tym interfejsem całkowicie: S Jak tylko mam szansę, spróbuję wymyślić, jak z nim pracować i zgłoś wyniki. :) Twoje zdrowie. Nadal jednak, jeśli ktoś może udostępnić próbkę kodu - byłoby to naprawdę miłe. –

+0

jak podano w msdn: "Pobiera liczbę bajtów do użycia dla każdego sektora podczas zapisu. Zwrócona wartość wskazuje, jaka wartość została wcześniej ustawiona za pomocą IWriteEngine2 :: put_BytesPerSector, i nie zwraca bieżących bajtów na sektor dla mediów." Ta właściwość służy innym celom. –

Powiązane problemy