2011-05-11 10 views
68

Esiste comunque in .Net (C#) per estrarre i dati da un file zip senza decomprimere il file completo?Come leggere i dati da un file zip senza dover decomprimere l'intero file

Semplicemente potrei voler estrarre i dati (file) dall'inizio di un file zip, ovviamente questo dipende se l'algoritmo di compressione comprime il file in un ordine deterministico.

+3

Questa domanda è formulata in un modo che è difficile da capire, Ti consiglio di aggiornare il titolo della tua domanda per essere più simile a "Come leggere i dati da un file zip senza dover decomprimere l'intero file" –

+0

@Chris Ho cambiato il titolo in base al tuo suggerimento, sono d'accordo che è più facile da capire rapidamente . – JYelton

+0

Dupe di http://stackoverflow.com/questions/328343/using-sharpziplib-to-unzip-file specifico? – Magnus

risposta

63

DotNetZip è il tuo amico qui.

Facile come:

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

(si può anche estrarre un file o altre destinazioni).

Leggendo tavolo del file zip dei contenuti è 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"); 

    } 
} 
+8

+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 l'app chiama Extract() su una voce, DotNetZip cerca la posizione corretta nel file zip e decomprime i dati solo per quella voce. – Cheeso

14

Qualcosa di simile elencherà ed estrarre 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()); 
    } 
} 

Sulla base di questo esempio: content inside zip file

+1

Francamente parlando, non ho potuto vedere come questo link risponde alla domanda. –

0

file Zip hanno una tabella di contenuti. Ogni utilità 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 ridirigerlo a un file di testo.

0

In tal caso sarà necessario analizzare zip voci di intestazione locali. Ogni file, memorizzato nel file zip, ha preceduto la voce dell'intestazione file locale, che (normalmente) contiene informazioni sufficienti per la decompressione, in genere è possibile eseguire semplici analisi di tali voci nello stream, selezionare il file necessario, l'intestazione della copia + i dati del file compresso in altri file e chiama unzip su quella parte (se non vuoi gestire l'intero codice decompressione Zip o la libreria).

78

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

Find "myfile" nel file zip ed estrarlo.

+20

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

+7

riferimenti: 'System.IO.Compression.dll' e' System.IO.Compression.FileSystem.dll' – yzorg

1

Ecco come un file di testo UTF-8 può essere letto da un archivio zip in una variabile stringa (.NET Framework 4.5 in su):

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()); 
Problemi correlati