2010-09-14 18 views
10

के रूप में 7z फ़ाइलों का इलाज करना मैं एकाधिक स्ट्रीम ऑपरेशंस को चेन करना चाहता हूं (जैसे फ़ाइल डाउनलोड करना, फ्लाई पर असम्पीडित करना, और बिना किसी अस्थायी फ़ाइलों के डेटा को प्रोसेस करना)। फाइल 7z प्रारूप में हैं। एक एलजेएमएमए एसडीके उपलब्ध है, लेकिन मुझे स्ट्रीम होने की बजाए बाहरी आउटपुट स्ट्रीम बनाने के लिए मजबूर करता है - दूसरे शब्दों में आउटपुट स्ट्रीम को इसके साथ काम करने से पहले पूरी तरह से लिखा जाना चाहिए। SevenZipSharp भी इस कार्यक्षमता को याद कर रहा है।.NET स्ट्रीम

क्या किसी ने ऐसा कुछ किया है?

// in pseudo-code - CompressedFileStream derives from Stream 
foreach (CompressedFileStream f in SevenZip.UncompressFiles(Web.GetStreamFromWeb(url)) 
{ 
    Console.WriteLine("Processing file {0}", f.Name); 
    ProcessStream(f); // further streaming, like decoding, processing, etc 
} 

प्रत्येक फ़ाइल धारा की तरह व्यवहार करते हैं एक-पढ़ने के लिए एक बार एक फ़ाइल का प्रतिनिधित्व करने, और मुख्य संकुचित धारा पर MoveNext बुला() स्वचालित रूप से & उस फ़ाइल को छोड़ अमान्य हैं स्ट्रीम।

संपीड़न के लिए इसी तरह की संरचनाएं की जा सकती हैं। उदाहरण उपयोग - डेटा की एक बड़ी मात्रा पर कुछ एकत्रीकरण करें - प्रत्येक फ़ाइल में प्रत्येक डेटा लाइन के लिए, प्रत्येक फ़ाइल के लिए, प्रत्येक फ़ाइल में प्रत्येक 7z फ़ाइल के लिए, प्रत्येक मान में प्रत्येक डेटा लाइन के लिए, कुछ मान योग करें।

अद्यतन 2012-01-06

#ziplib (SharpZipLib) पहले से ही वास्तव में क्या मैं ZipInputStream वर्ग के साथ ज़िप फ़ाइलें के लिए की जरूरत है। यहां एक उदाहरण दिया गया है जो किसी भी ज़िप फ़ाइल के अंदर सभी फ़ाइलों को अदृश्य धाराओं के रूप में उत्पन्न करता है। अभी भी 7z समाधान की तलाश में है।

IEnumerable<Stream> UnZipStream(Stream stream) 
{ 
    using (var zipStream = new ZipInputStream(stream)) 
    { 
     ZipEntry entry; 
     while ((entry = zipStream.GetNextEntry()) != null) 
      if (entry.IsFile) 
       yield return zipStream; 
    } 
} 

उत्तर

0

अंतर्निहित एल्गोरिथ्म और मापदंडों संपीड़न के समय पर निर्दिष्ट इस्तेमाल किया मात्रा का आकार निर्धारित है और वहाँ यह सुनिश्चित करें कि के रूप में आप हिस्सा डिकोड, वे शब्द/लाइन सीमा पर गिर कोई रास्ता नहीं है। तो, प्रसंस्करण से पहले आपको पूरी तरह से एक फाइल को डिकंप्रेस करना होगा।

आप क्या करना पूछ रहे हैं अस्थायी फ़ाइलों के बिना शायद संभव नहीं है - क्या यह वास्तव में पर निर्भर करता है कि क्या आप एक MemoryStream के माध्यम से decompressed फ़ाइल खुला रखने के लिए पर्याप्त स्मृति है, अपने सभी संसाधन प्रदर्शन और उसके बाद स्मृति जारी पूल में वापस। यह और जटिल है कि यह विखंडन (प्रक्रिया स्मृति की) है जिसे आप बार-बार ऐसा करने का कारण बन सकते हैं।

+0

मुझे यकीन नहीं है कि मैं समझता हूं कि शब्द/रेखा सीमाओं से आपका क्या मतलब है। 'संपीड़ित फ़ाइलस्ट्रीम' ऑब्जेक्ट उस क्षण को वापस कर दिया गया है जब सेवनज़िप को पूरी फ़ाइल प्राप्त करने के बाद स्ट्रीम से फ़ाइल शीर्षलेख प्राप्त होता है। डिकंप्रेस्ड फ़ाइल के डेटा को पढ़ने से स्रोत स्ट्रीम भी अग्रिम हो जाता है। – Yurik

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