2012-03-24 31 views
5

आयनिक ज़िप मुझे ज़िप फ़ाइल को मौजूदा फ़ाइल जोड़ने और ज़िप फ़ाइल बनाने की अनुमति देता है। लेकिन इस बात पर विचार करते हुए कि मैं बनाई गई ज़िप फ़ाइल से उन बाइट [] को पढ़ रहा हूं और सर्वर पर भेज रहा हूं, मुझे सर्वर पर ज़िप स्टोर करने के लिए उस बाइट [] से ज़िप फ़ाइल फिर से बनाने की आवश्यकता है। मुझे यह कैसे हासिल होगा ?आयनिक ज़िप: बाइट से ज़िप फ़ाइल निर्माण []

मैं सी # का उपयोग कर रहा हूं।

उत्तर

16

अगर मैं आपके सवाल का सही ढंग से समझ, आप नेटवर्क पर अपने byte[] डेटा सरणी मिलता है और एक ज़िप फ़ाइल में डेटा को सहेजना चाहते हैं? आप एक MemoryStream जो आप byte[] आप मिल गया है (जैसा कि docs में दिखाया गया है) से बनाने से एक नई ZipEntry बना सकते हैं:

byte[] data = MethodThatReceivesYourDataOverTheNet(); 
using (MemoryStream stream = new MemoryStream(data)) 
{ 
    using (ZipFile zip = new ZipFile()) 
    { 
     zip.AddEntry("name_of_the_file_in_the_arhive.bin", "base", stream); 
     zip.Save("example.zip"); 
    } 
} 
+0

धन्यवाद। यह वहीं है जिसे मैं ढूंढ रहा था। – Cannon

+0

AddEntry अब इस कन्स्ट्रक्टर को प्रदान नहीं करता है। एकमात्र ऐसा जो स्ट्रीम को पारित करने की अनुमति देता है अब एडेंट्री ([फ़ाइल नाम], [स्ट्रीम]) है। – JRodd

9

यह नहीं अपने प्रश्न से वास्तव में स्पष्ट है तुम क्या कर रहे हैं - लेकिन अगर आप सिर्फ डेटा प्राप्त करने के पुन: लोड डिस्क के लिए बचत से बचने के लिए कोशिश कर रहे हैं और उसके बाद, बस एक MemoryStream को बचाने:

byte[] data; 
using (MemoryStream ms = new MemoryStream()) 
{ 
    zipFile.Save(ms); 
    data = ms.ToArray(); 
} 
// Do whatever with data. 

वैकल्पिक रूप से, MemoryStream.GetBuffer() का उपयोग एक और प्रतिलिपि बनाने से बचने के लिए:

byte[] buffer; 
int length; 
using (MemoryStream ms = new MemoryStream()) 
{ 
    zipFile.Save(ms); 
    buffer = ms.ToArray(); 
    length = ms.Length; 
} 

// Now use buffer, but only up to "length"... 
संबंधित मुद्दे