2014-12-22 3 views
9

ich Ionic.Zip bin mit ZipFile zu Speicher-Stream mit dieser Methode zu extrahieren:Lesen ionische Zip als Speicher-Stream 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; 
} 

Sobald ich Extrahieren bin fertig, ich will die Ströme lesen und einige der erhalten Einträge basierend auf dem Eintrag Dateiname. Wie kann ich das machen?

Ich habe versucht, indem sie mit dem folgenden Code aufrufen, aber ich bekomme Fehler auf dem ZipFile.Read(ms) die sagte:

dass als ZipFile Kann nicht

für die
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; 
    } 
} 

Vielen Dank im Voraus lesen Hilfe!

+5

Bytes Nachdem Sie 'Extrahieren von()' die Daten getan haben (im Mem-Stream) ist nicht mehr gezippt ... Sie haben eine Reihe von verketteten unkomprimierten Dateien. –

+0

Wie Henk Holterman vorschlägt, sollten Sie, wenn Sie nicht mit verschachtelten Zip-Dateien arbeiten, die Dateien nicht noch einmal im zweiten Snippet entpacken. Können Sie eine Beispielstruktur der Dateien angeben, die Sie entpacken möchten? Alternativ würde ich vorschlagen, dass Sie die gesamte Filterung in der ersten Schleife durchführen und vielleicht sogar das Bild dort erstellen, um nicht alle Dateien, die Sie lesen möchten, in einen einzigen Stream zu schreiben. –

+2

Zusätzlich zu der Beobachtung, die Henk gemacht hat, schlage ich vor, dass Sie Ionic.Zip dafür nicht verwenden. .NET verfügt jetzt über die 'ZipArchive'-Klasse, die integrierte Funktionen zum Verarbeiten von ZIP-Dateien bietet und die IMHO bequemer ist als der Code, den Sie jetzt haben. –

Antwort

0

@HenkHolerman hat Recht, Sie haben zu diesem Zeitpunkt keine Zip-Datei mehr. Sie sollten in Erwägung ziehen, den Inhalt der ZIP-Datei in ein temporäres Verzeichnis zu extrahieren und dann mit den Bilddateien über das Dateisystem zu arbeiten.

11

Dies kann wenig alte Frage und späte Antwort, aber ich habe etwas getan, die Dateien zu erhalten, wie Sammlungen und deren Dateinamen wie dieser

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

Danke. Ich habe danach gesucht. Ich habe nicht auf verschiedene virtuelle Extract() -Funktion zugegriffen. –