Tüm dosyayı açmak zorunda kalmadan bir zip dosyasındaki verileri okuma


99

.Net (C #) içinde, dosyanın tamamını açmadan bir zip dosyasından veri çıkarmak için zaten var mı?

Basitçe, bir zip dosyasının başlangıcından verileri (dosya) ayıklamak istiyorum, tabii ki bu, sıkıştırma algoritmasının dosyayı belirleyici bir sırayla sıkıştırıp sıkıştırmamasına bağlıdır.


Yanıtlar:


79

DotNetZip burada arkadaşınızdır.

Kadar kolay:

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

(ayrıca bir dosyaya veya diğer hedeflere çıkartabilirsiniz).

Zip dosyasının içindekiler tablosunu okumak şu kadar kolaydır:

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");

  }
}

Not Edildi : DotNetZip eskiden Codeplex'te yaşıyordu. Codeplex kapatıldı. Eski arşiv Codeplex'te hala mevcuttur . Görünüşe göre kod Github'a taşınmış:



9
+1. Perde arkasında, yapıcıda DotNetZip'in yaptığı şey, zip dosyasının içindeki "dizini" aramak ve sonra onu okuyup girişlerin listesini doldurmaktır. Bu noktada, uygulamanız bir girişte Extract () öğesini çağırırsa, DotNetZip zip dosyasında uygun yeri arar ve yalnızca o giriş için verileri açar.
Cheeso

117

.Net Framework 4.5 ile ( ZipArchive kullanarak ):

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

Zip dosyasında "dosyam" ı bulun ve çıkartın.


37
Ayrıca, yalnızca akışı almak için entry.Open () kullanılabilir (eğer içerikler okunmalı ancak bir dosyaya yazılmamalıysa).
2014

17
referanslar: System.IO.Compression.dllveSystem.IO.Compression.FileSystem.dll
yzorg

18

SharpZipLib'i kullanmak istiyorsanız, buna benzer bir şey dosyaları tek tek listeleyecek ve çıkaracaktır:

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());
     }
 }

Bu örneğe göre: zip dosyası içindeki içerik


1
Açıkçası, bu bağlantının soruyu nasıl yanıtladığını göremedim.
Eugene Mayevski 'Callback

11

Bir UTF8 metin dosyasının bir zip arşivinden bir dize değişkenine (.NET Framework 4.5 ve üstü) nasıl okunabileceği aşağıda açıklanmıştır:

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

Zip dosyalarında bir içindekiler tablosu bulunur. Her zip yardımcı programı yalnızca TOC'yi sorgulama yeteneğine sahip olmalıdır. Veya içindekiler tablosunu yazdırmak ve bir metin dosyasına yönlendirmek için 7zip -t gibi bir komut satırı programı kullanabilirsiniz.


0

Böyle bir durumda, zip yerel başlık girişlerini çözümlemeniz gerekecektir. Zip dosyasında depolanan her dosyanın önünde (normalde) sıkıştırmayı açma için yeterli bilgi içeren Yerel Dosya Başlığı girişi vardır.Genel olarak, bu tür girişleri akışta basit bir şekilde ayrıştırabilir, gerekli dosyayı seçebilir, başlığı + sıkıştırılmış dosya verilerini diğerine kopyalayabilirsiniz. dosyasını açın ve bu kısımda unzip çağrısı yapın (tüm Zip açma kodu veya kitaplığı ile uğraşmak istemiyorsanız).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.