2014-12-22 31 views
9

Sto usando Ionic.Zip per estrarre ZipFile al flusso di memoria con questo metodo:Leggi Zip ionica come memoria flusso C#

private MemoryStream GetReplayZipMemoryStream() 
{ 
    MemoryStream zipMs = new MemoryStream(); 
    using (ZipFile zip = ZipFile.Read(myFile.zip)) 
    { 
     foreach (ZipEntry zipEntry in zip) 
     { 
      if (zipEntry.FileName.StartsWith("Aligning") || zipEntry.FileName.StartsWith("Sensing")) 
      { 
       zipEntry.Extract(zipMs); 
      } 
     } 
    } 

    zipMs.Seek(0, SeekOrigin.Begin); 
    return zipMs; 
} 

Una volta che mi sono fatto l'estrazione, voglio leggere i flussi e ottenere alcuni dei voci basate sul nome file della voce. Come lo posso fare?

ho cercato chiamando con il codice qui sotto, ma ottengo l'errore sul ZipFile.Read(ms) che diceva:

Non può leggere che, come uno ZipFile

Stream ms = GetReplayZipMemoryStream(); 
using (ZipFile zip = ZipFile.Read(ms)) 
{ 
    ZipEntry imageEntry = zip.Entries.First(x => x.FileName.EndsWith(".png")); 
    using (Stream s = imageEntry.OpenReader()) 
    { 
     var image = Image.FromStream(s); 
     pictureBox1.Image = image; 
    } 
} 

Grazie in anticipo per la Aiuto!

+5

Dopo aver fatto '.Extract()' i dati (nel flusso mem) non è più zippato ... Hai una serie di file non compressi concatenati. –

+0

Come suggerisce Henk Holterman, a meno che non si abbia a che fare con file zip annidati, non si deve decomprimere i file ancora una volta nel secondo frammento. Potresti fornire una struttura di esempio dei file che stai cercando di decomprimere? In alternativa ti suggerisco di fare tutto il filtraggio nel primo ciclo e magari anche di creare l'immagine lì, per non scrivere tutti i file che vuoi leggere, in un unico stream. –

+2

Oltre all'osservazione fatta da Henk, ti ​​suggerisco di non usare Ionic.Zip per farlo comunque. .NET ora ha la classe 'ZipArchive', che fornisce funzionalità integrate per gestire i file .zip e che IMHO è più conveniente del codice che hai ora. –

risposta

0

@HenkHolerman ha ragione, non hai più un file zip in quel punto. Si consiglia di prendere in considerazione l'estrazione del contenuto del file zip in una directory temporanea e quindi l'esecuzione sui file di immagine tramite il file system.

11

Questo può essere po 'vecchio e domanda risposta in ritardo, ma ho fatto qualcosa per ottenere i file come byte collezioni e le sue nomi di file come questo

public static Dictionary<string, byte[]> Decompress(Stream targFileStream) 
{ 
    Dictionary<string, byte[]> files = new Dictionary<string, byte[]>(); 

    using(ZipFile z = ZipFile.Read(targFileStream)) 
    { 
     foreach (ZipEntry zEntry in z) 
     { 
      MemoryStream tempS = new MemoryStream(); 
      zEntry.Extract(tempS); 

      files.Add(zEntry.FileName, tempS.ToArray()); 
     } 
    } 

    return files; 
} 
+0

Grazie. Ho cercato questo. Non ho guardato alla diversa funzione virtuale Extract(). –