2012-08-08 6 views
5

सी # में से एक धारा पाने की कोशिश में, मैं DotNetZip मैं एक ज़िप कहा जाता है का उपयोग कर रहा "innerZip.zip" जिसमें कुछ डेटा, और एक अन्य ज़िप "outerZip.zip" कहा जाता है जिसमें आंतरिक ज़िप होता है। मैं ऐसा क्यों कर रहा हूं? अच्छी तरह से, पासवर्ड सेट करते समय, पासवर्ड वास्तव में संग्रह में जोड़े गए व्यक्तिगत प्रविष्टियों पर लागू होता है, न कि संपूर्ण संग्रह, इस आंतरिक/बाहरी कॉम्बो का उपयोग करके, मैं पूरे आंतरिक ज़िप पर एक पास सेट कर सकता हूं क्योंकि यह एक प्रविष्टि है बाहरी एक के।हो रही एक अपवाद "यह एक ज़िप फ़ाइल के रूप में नहीं पढ़ सकते" एक इनर ज़िप फ़ाइल (एक और पिन के भीतर एक पिन)

समस्या है, ठीक है, कोड सामान्य शब्दों से बेहतर बोलती है:

ZipFile outerZip = ZipFile.Read("outerZip.zip"); 
outerZip.Password = "VeXe"; 
Stream innerStream = outerZip["innerZip.zip"].OpenReader(); 
ZipFile innerZip = ZipFile.Read(innerStream); // I'm getting the exception here. 
innerZip["Songs\\IronMaiden"].Extract(tempLocation); 

क्यों मुझे लगता है कि अपवाद मिल रहा है? आंतरिक फ़ाइल एक ज़िप फ़ाइल है, इसलिए मुझे यह अपवाद सही नहीं मिलना चाहिए? इस के आसपास जाने का कोई तरीका है या मुझे बाहरी से बाहरी को निकालना है, और फिर इसे एक्सेस करना है?

पहले से

Thanx ..

उत्तर

6

यह अपवाद होती है क्योंकि CrcCalculatorStream धारा है कि OpenReader बनाता seekable नहीं है, और ZipFile.Read(Stream) की कोशिश करता है, जबकि ज़िप फ़ाइल खोलने की तलाश के लिए।

ज़िप संपीड़न की प्रकृति ज़िप्ड सामग्री में किसी स्थान की तलाश को रोकती है, तो सामग्री को क्रम में डिकंप्रेस किया जाना चाहिए।

इसके आस-पास एक तरीका आंतरिक ज़िप फ़ाइल को MemoryStream पर निकालना होगा और उसके बाद ZipFile.Read के माध्यम से लोड करना होगा।

MemoryStream ms = new MemoryStream(); 
outerZip["innerZip.zip"].Extract(ms); 
ms.Seek(0, SeekOrigin.Begin); 
ZipFile innerZip = ZipFile.Read(ms); 
innerZip["Songs\\IronMaiden"].Extract(tempLocation); 
+1

मुझे पता है कि यह पोस्ट थोड़ा दिनांकित है। लेकिन टिप के लिए धन्यवाद! यह झुकाव के मेरे घंटों के एक सहयोगी बचाया! +1 –

संबंधित मुद्दे