2012-09-14 8 views
8

पर उपलब्ध स्थान क्योंकि मेरा मूल प्रश्न थोड़ा अस्पष्ट था, मुझे स्पष्टीकरण दें।रिक्त डीवीडी/ब्लू-रे डिस्क (IMAPI)

मेरे लक्ष्य हैं:

  1. IMAPI
  2. के माध्यम से फाइल सिस्टम का चयन अंतरिक्ष जो मेरी फाइल इस डिस्क पर की खपत होगी अगर मैं इसे जला अनुमान लगाने के लिए के बाद खाली डिस्क आकार का अनुमान लगाना।

मैं जानना चाहूंगा क्या:

  1. यह संभव चयनित फ़ाइल सिस्टम के लिए क्षेत्र प्रति बाइट्स प्राप्त करने के लिए प्रोग्राम के रूप में
  2. यदि नहीं है, वहाँ क्षेत्र जो IMAPI के लिए उपयोग करता है प्रति बाइट्स के लिए डिफ़ॉल्ट मान है विभिन्न फाइल सिस्टम/मीडिया प्रकार, और यह कहीं कहीं दस्तावेज है।
+2

क्यों WMI एक विकल्प नहीं है? – PhonicUK

+0

@ एसएल। बार्थ, मैं ऐसा नहीं सोचता। –

+0

@PonicUK, पिछले अनुभव :) यदि कोई अन्य तरीका नहीं है, तो मैं इसका उपयोग करूंगा। मैं उन मूल्यों को IMAPI, tbh के माध्यम से प्राप्त करने की उम्मीद कर रहा था। –

उत्तर

4

ठीक है, तो मेरे प्रश्न का संक्षिप्त उत्तर यह है: कोई सुरक्षित हो सकता है मान लीजिए, डीवीडी/बीडी डिस्क = 2048 बाइट्स के लिए उस क्षेत्र का आकार।

कारण क्यों मैं अपने डिबग सत्र के दौरान अलग-अलग आकार हो रही थी, कोड में कोई त्रुटि है, जो क्षेत्रों गिनती :) लिया गया की वजह से था

उल्लेख कोड ब्लॉक http://www.codeproject.com/Articles/24544/Burning-and-Erasing-CD-DVD-Blu-ray-Media-with-C-an से copypasted किया गया था, तो बस मामले im पोस्टिंग में एक त्वरित फिक्स।

मूल कोड:

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 तक विभिन्न मीडिया प्रकारों और ब्लॉक आकार के साथ अपने ऐप को डीबग किया (मैंने विंडोज एक्सप्लोरर में प्रदर्शित कुल आकारों को देखकर मैन्युअल रूप से गणना की) –

+0

एक्सप्लोरर में प्रदर्शित कुल आकार प्राप्त करने के लिए बस 'ड्राइवइन्फो' उदाहरण का उपयोग करें गणना करो - http://msdn.microsoft.com/en-us/library/system.io.driveinfo.aspx – PhonicUK

0

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

+0

ओह, मैंने इस इंटरफ़ेस को पूरी तरह याद किया है: एस जैसे ही मुझे मौका मिलता है, मैं यह समझने की कोशिश करूंगा कि इसके साथ कैसे काम करें और परिणामों की रिपोर्ट करें। :) चेयर। फिर भी, अगर कुछ 1 कोड नमूना साझा कर सकते हैं - यह वास्तव में अच्छा होगा। –

+0

जैसा कि एमएसडीएन पर बताया गया है: "लेखन के दौरान प्रत्येक क्षेत्र के लिए उपयोग करने के लिए बाइट्स की संख्या प्राप्त करता है। लौटाया गया मान इंगित करता है कि पहले IWriteEngine2 :: put_BytesPerSector के साथ निर्धारित मान क्या है, और मीडिया के लिए प्रति क्षेत्र मूल्य वर्तमान बाइट्स नहीं लौटाता है।" तो, यह संपत्ति अलग-अलग उद्देश्य प्रदान करती है। –