ZipLib, Dateien in den Speicher auslesen

Hallo,

hoffe ich bin hier richtig sonst bitte Info welches Forum besser passt.

Ich möchte mittels der IcSharpZipLib eine passwortgeschütze ZIP-Datei (Pwd ist bekannt) auslesen bzw darin enthaltene Dateien entpacken. Das ganze allerdings nicht auf die Festplatte sondern Datei für Datei im RAM.

Innerhalb der Zip-Datei sind die mich interessierenden Dateien nochmals in ein Zip verpackt (ohne Pwd), was das ganze für mich etwas schwierig macht.

Mir stellen sich eine Fragen:
Wie kann ich eine Datei nach der anderen in den Speicher laden um diese dort dann nochmals als Zip-Datei zu öffnen?

Ich habe bereits gegoogelt aber leider nichts passendes gefunden aus dem ich meine Frage beantworten kann.

Wäre für Infos sehr dankbar.

Gruss,
Daniel
 
Hi, aus dem ZipInputStream bekommst du ZipEntry-Objekte heraus. Diese kannst du dann ja weiterverarbeiten, wenn es sich dabei wieder um ein Zip handelt.
 
Hallo Norbert,

vielen Dank für Deine Antwort.

Ich habe es mittlerweile soweit geschafft das ich quasi das Inhaltsverzeichnis über ZipEntry abgerufen habe und damit konnte ich schon mal ein Array mit Pfad/Dateiname sowie die Kompression (gibt wohl nur 0 und 8) sowie die Info ob Datei verschlüsselt ist oder nicht füllen.

Damit könnte ich jetzt zwar die einzelnen Dateien auf die Platte extrahieren, aber genau das möchte bzw darf ich nicht da diese Dateien nicht auf die Platte abgelegt werden sollen.

Daher die Idee ein Zip-im-Zip-File nach dem anderen in den RAM extrahieren bzw die benötigte Manifest.xml sowie die dazugehörende Datei.

Aber genau bei diesem Schritt hängt es, mir ist nicht ganz klar wie ich die Datei so in den RAM entpacken kann das ich diese dann auslesen kann (Inhalt).

Wie könnte ich das tun? Da wäre ich für diese Info sehr dankbar.

Gruss,
Daniel
 
Naja, anstatt die Daten in einen StreamWriter zu schreiben, schreibst du sie in einen MemoryStream. Bei dem kannst du dann die Position auf 0 stellen und stehst somit am Anfang der Daten und kannst sie weiterverarbeiten.
 
Hallo Norbert,

ok, wenn ich nun eine Datei in den MemoryStream geladen habe und die Position wieder auf 0 setze, kann ich dann wiederum mit mit ZipLib die Datei öffnen?

Hier komme ich irgendwie nicht weiter, wie muss ich mir den Zugriff vorstellen?

Vorgehen wäre:
-ZipFile von HDD öffnen und Inhaltsverzeichnis lesen
-Array durchgehen und jedes ZipFile aus der Datei in den Memory laden
-Position des Stream auf 0 setzen
-Datei im Memory wiederum Inhaltsverzeichnis auslesen und Datei für Datei in einen neuen MemoryStream lesen
-Datei im zweiten MemoryStream dann mit einem XML-Parser lesen

Ist das so? Gibt es im Zugriff kein Unterschied ob auf der Platte oder im Memory?

Sorry, aber das ist mir nicht ganz klar und meine Versuche führten erst mal zu nichts :)

Gibt es evtl ein Beispiel wie eine XML-Datei in den Speicher und dort dann geöffnet wird?


Gruss,
Daniel
 
Hier ein wenig Code. Getestet an folgender Hierarchie:

test.zip.zip
|- test.zip
___|---- test.xml


Damit hat es soweit funktioniert.

Code:
private void Unzip(String filename)
{
    ZipInputStream inputStream = new ZipInputStream(File.OpenRead(filename));
    ZipEntry entry = null;
    int nBytes = 2048;
    byte[] data = new byte[2048];

    while ((entry = inputStream.GetNextEntry()) != null)
    {
        if (entry.Name.ToUpperInvariant().EndsWith("ZIP"))
        {
            MemoryStream ms = new MemoryStream();
            while ((nBytes = inputStream.Read(data, 0, data.Length)) > 0)
                ms.Write(data, 0, nBytes);
            ms.Position = 0;

            ZipInputStream tempStream = new ZipInputStream(ms);
            ZipEntry tempEntry = null;

            while ((tempEntry = tempStream.GetNextEntry()) != null)
            {
                int nBytes2 = 2048;
                byte[] data2 = new byte[2048];
                while ((nBytes2 = tempStream.Read(data2, 0, data2.Length)) > 0)
                    ResultBox.AppendText(new ASCIIEncoding().GetString(data2, 0, nBytes2));
            }
        }
    }
    inputStream.Close();
}
 
Hallo Norbert,

war bis gestern beruflich weg und konnte daher nicht wieder reinschauen.

Erst mal vielen Dank für das Script, werde es heute gleichmal anschauen und versuchen nach VB portieren.

Wenn das so klappt wäre es echt cool.

Nochmals besten Dank.

Gruss,
Daniel
 
Mein ganz einfacher Test hat funktioniert. Gib einfach Bescheid ob es für deine Fälle ausreicht, sonst müssen wir da eben noch ein wenig dran herumschrauben.

Die Portierung kannst du mit Hilfe des .NET Reflectors machen, vereinfacht die ganze Sache :)
 
Hallo Norbert,

irgendwie klappt das nicht so recht, habe jetzt ein paar Scripte versucht zu schreiben aber was sinnvolles gab es noch nicht wirklich.

Kannst Du mir vieleicht doch helfen wenn es bei Dir funktioniert hat? Ich komme nur mit C# nicht klar. Ich dachte zwar das alle verweise angelegt habe, jedoch klappt es in soweit nicht das ich die zuerst eingelesene Datei dann auch finde/öffnen kann.

War eigentlich alles soweit klar von c# auf vb umzustellen, aber ist doch nicht so einfach wie gedacht :)

Wäre also toll wenn Du Dich mir nochmal annehmen könntest...

Viele Grüsse,
Daniel
 
Also in VB.NET müsste das in etwa so aussehen:
Code:
Private Sub Unzip(ByVal filename As String)
    Dim inputStream As New ZipInputStream(File.OpenRead(filename))
    Dim entry As ZipEntry = Nothing
    Dim nBytes As Integer = 2048
    Dim data As Byte() = New Byte(2047) {}
    
    While (entry = inputStream.GetNextEntry()) IsNot Nothing
        If entry.Name.ToUpperInvariant().EndsWith("ZIP") Then
            Dim ms As New MemoryStream()
            While (nBytes = inputStream.Read(data, 0, data.Length)) > 0
                ms.Write(data, 0, nBytes)
            End While
            ms.Position = 0
            
            Dim tempStream As New ZipInputStream(ms)
            Dim tempEntry As ZipEntry = Nothing
            
            While (tempEntry = tempStream.GetNextEntry()) IsNot Nothing
                Dim nBytes2 As Integer = 2048
                Dim data2 As Byte() = New Byte(2047) {}
                While (nBytes2 = tempStream.Read(data2, 0, data2.Length)) > 0
                    ResultBox.AppendText(New ASCIIEncoding().GetString(data2, 0, nBytes2))
                End While
            End While
        End If
    End While
    inputStream.Close()
End Sub
 

Neue Beiträge

Zurück