Come leggere i dati da un file zip senza dover decomprimere l'intero file


Risposte:


78

DotNetZip è tuo amico qui.

Facile come:

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

(puoi anche estrarre in un file o in altre destinazioni).

Leggere il sommario del file zip è facile come:

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

  }
}

A cura di Nota: DotNetZip viveva a Codeplex. Codeplex è stato chiuso. Il vecchio archivio è ancora disponibile su Codeplex . Sembra che il codice sia migrato su Github:



9
+1. Dietro le quinte, ciò che DotNetZip fa nel costruttore è cercare la "directory" all'interno del file zip, quindi leggerlo e popolare l'elenco delle voci. A quel punto, se la tua app chiama Extract () su una voce, DotNetZip cerca la posizione corretta nel file zip e decomprime i dati solo per quella voce.
Cheeso

115

Con .Net Framework 4.5 (utilizzando ZipArchive ):

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

Trova "myfile" in zipfile ed estrailo.


35
Si può anche usare entry.Open () per ottenere solo il flusso (se il contenuto deve essere letto ma non scritto in un file).
anre

17
riferimenti: System.IO.Compression.dlleSystem.IO.Compression.FileSystem.dll
yzorg

18

Qualcosa di simile elencherà ed estrarrà i file uno per uno, se si desidera utilizzare 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());
     }
 }

Basato su questo esempio: contenuto all'interno del file zip


1
Francamente, non riuscivo a vedere come questo link risponde alla domanda.
Callback di Eugene Mayevski,

10

Ecco come un file di testo UTF8 può essere letto da un archivio zip in una variabile stringa (.NET Framework 4.5 e versioni successive):

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

I file zip hanno un sommario. Ogni utility zip dovrebbe avere la capacità di interrogare solo il sommario. Oppure puoi usare un programma a riga di comando come 7zip -t per stampare il sommario e reindirizzarlo a un file di testo.


0

In tal caso sarà necessario analizzare le voci dell'intestazione locale zip. Ogni file, memorizzato nel file zip, ha una voce di intestazione del file locale precedente, che (normalmente) contiene informazioni sufficienti per la decompressione, in genere è possibile eseguire un'analisi semplice di tali voci nel flusso, selezionare il file necessario, copiare l'intestazione + i dati del file compresso in altri file e chiama unzip su quella parte (se non vuoi occuparti dell'intero codice di decompressione Zip o libreria).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.