पूरी फ़ाइल को अनज़िप किए बिना ज़िप फ़ाइल से डेटा कैसे पढ़ें


97

वैसे भी .net (C #) में पूरी फाइल को डिकम्प्रेस किए बिना ज़िप फ़ाइल से डेटा निकालने के लिए क्या है?

बस मैं संभवतः ज़िप फ़ाइल की शुरुआत से डेटा (फ़ाइल) निकालना चाहता हूं, जाहिर है कि यह निर्भर करता है कि संपीड़न एल्गोरिदम फ़ाइल को एक निर्धारक क्रम में संपीड़ित करता है।


जवाबों:


78

DotNetZip यहां आपका मित्र है।

इतना आसान जैसे की:

using (ZipFile zip = ZipFile.Read(ExistingZipFile))
{
  ZipEntry e = zip["MyReport.doc"];
  e.Extract(OutputStream);
}

(आप एक फ़ाइल या अन्य गंतव्यों के लिए भी निकाल सकते हैं)।

सामग्री की ज़िप फ़ाइल की तालिका पढ़ना उतना ही आसान है:

using (ZipFile zip = ZipFile.Read(ExistingZipFile))
{
  foreach (ZipEntry e in zip)
  {
    if (header)
    {
      System.Console.WriteLine("Zipfile: {0}", zip.Name);
      if ((zip.Comment != null) && (zip.Comment != "")) 
        System.Console.WriteLine("Comment: {0}", zip.Comment);
      System.Console.WriteLine("\n{1,-22} {2,8}  {3,5}   {4,8}  {5,3} {0}",
                               "Filename", "Modified", "Size", "Ratio", "Packed", "pw?");
      System.Console.WriteLine(new System.String('-', 72));
      header = false;
    }
    System.Console.WriteLine("{1,-22} {2,8} {3,5:F0}%   {4,8}  {5,3} {0}",
                             e.FileName,
                             e.LastModified.ToString("yyyy-MM-dd HH:mm:ss"),
                             e.UncompressedSize,
                             e.CompressionRatio,
                             e.CompressedSize,
                             (e.UsesEncryption) ? "Y" : "N");

  }
}

नोट करने के लिए संपादित: डॉटनेटज़िप कोडप्लेक्स में रहती थी। कोडप्लेक्स को बंद कर दिया गया है। पुराना संग्रह अभी भी कोडप्लेक्स में उपलब्ध है । ऐसा लगता है कि कोड Github में स्थानांतरित हो गया है:



9
+1। पर्दे के पीछे, DotNetZip कंस्ट्रक्टर में क्या करता है, वह जिप्फ़िले के अंदर "निर्देशिका" की तलाश में है, और फिर इसे पढ़ें और प्रविष्टियों की सूची पॉप्युलेट करें। उस बिंदु पर, यदि आपका ऐप एक प्रविष्टि पर एक्सट्रेक्ट () कहता है, तो DotNetZip ज़िप फ़ाइल में उचित स्थान की तलाश करता है, और उस प्रविष्टि के लिए डेटा को डिकम्प्रेस करता है।
चेसो

115

.Net फ्रेमवर्क 4.5 ( ZipArchive का उपयोग करके ) के साथ:

using (ZipArchive zip = ZipFile.Open(zipfile, ZipArchiveMode.Read))
    foreach (ZipArchiveEntry entry in zip.Entries)
        if(entry.Name == "myfile")
            entry.ExtractToFile("myfile");

जिपफाइल में "माइलफाइल" ढूंढें और इसे निकालें।


35
एक भी प्रविष्टि का उपयोग कर सकता है। पीडीएफ () केवल स्ट्रीम प्राप्त करने के लिए (यदि सामग्री को पढ़ा जाना चाहिए, लेकिन फ़ाइल में नहीं लिखा जाना चाहिए)।
ऐर

17
संदर्भ: System.IO.Compression.dllऔरSystem.IO.Compression.FileSystem.dll

18

यदि आप SharpZipLib का उपयोग करना चाहते हैं, तो कुछ इस तरह एक-एक करके फाइलों को सूचीबद्ध करेगा और निकालेगा:

var zip = new ZipInputStream(File.OpenRead(@"C:\Users\Javi\Desktop\myzip.zip"));
var filestream = new FileStream(@"C:\Users\Javi\Desktop\myzip.zip", FileMode.Open, FileAccess.Read);
ZipFile zipfile = new ZipFile(filestream);
ZipEntry item;
while ((item = zip.GetNextEntry()) != null)
{
     Console.WriteLine(item.Name);
     using (StreamReader s = new StreamReader(zipfile.GetInputStream(item)))
     {
      // stream with the file
          Console.WriteLine(s.ReadToEnd());
     }
 }

इस उदाहरण के आधार पर: ज़िप फ़ाइल के अंदर की सामग्री


1
सच कहूं, तो मैं यह नहीं देख सकता था कि यह लिंक कैसे सवाल का जवाब देता है।
यूजीन मेवस्की 'कॉलबैक

10

यहां बताया गया है कि कैसे एक UTF8 टेक्स्ट फाइल को जिप आर्काइव से स्ट्रिंग वेरिएबल (.NET फ्रेमवर्क 4.5 और अप) में पढ़ा जा सकता है:

string zipFileFullPath = "{{TypeYourZipFileFullPathHere}}";
string targetFileName = "{{TypeYourTargetFileNameHere}}";
string text = new string(
            (new System.IO.StreamReader(
             System.IO.Compression.ZipFile.OpenRead(zipFileFullPath)
             .Entries.Where(x => x.Name.Equals(targetFileName,
                                          StringComparison.InvariantCulture))
             .FirstOrDefault()
             .Open(), Encoding.UTF8)
             .ReadToEnd())
             .ToArray());

0

जिप फ़ाइलों में सामग्री की एक तालिका होती है। हर ज़िप उपयोगिता में सिर्फ TOC को क्वेरी करने की क्षमता होनी चाहिए। या आप सामग्री की तालिका को प्रिंट करने और इसे एक पाठ फ़ाइल पर पुनर्निर्देशित करने के लिए 7zip -t जैसे कमांड लाइन प्रोग्राम का उपयोग कर सकते हैं।


0

ऐसे मामले में आपको स्थानीय हेडर प्रविष्टियों को जिप करने की आवश्यकता होगी। ज़िप फ़ाइल में संग्रहीत प्रत्येक फ़ाइल में पूर्ववर्ती स्थानीय फ़ाइल हैडर प्रविष्टि होती है, जिसमें (सामान्य रूप से) विघटन के लिए पर्याप्त जानकारी होती है, आम तौर पर, आप स्ट्रीम में ऐसी प्रविष्टियों की सरल पार्सिंग कर सकते हैं, आवश्यक फ़ाइल का चयन कर सकते हैं, हेडर + संपीड़ित फ़ाइल डेटा अन्य को चुन सकते हैं फ़ाइल और उस हिस्से पर अनज़िप कॉल करें (यदि आप पूरे ज़िप अपघटन कोड या लाइब्रेरी से निपटना नहीं चाहते हैं)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.