Gibt es irgendwelche Zip-Komponenten mit solchen Funktionen? Ich muss ein zip-Archiv aus dem Internet in einen Stream herunterladen, dann das Archiv aus dem Stream öffnen und dann Dateien in einen anderen Stream extrahieren.
z. ZipForge kann ein Archiv aus einem Stream öffnen ZipForge.OpenArchive(MyStream, false);
aber wie zu einem anderen extrahieren ...?
Beschreibung
Verwenden Sie ExtractToStream, um in der Datei in der Datei gespeicherte Daten zu dekomprimieren Archivieren Sie ein TStream-Nachkommenobjekt wie TFileStream, TMemoryStream oder TBlobStream.
Der Parameter FileName gibt den extrahierten Dateinamen an.
Und welche Verwendung der Methode OpenArchive(MyStream, false)
, wenn die Extraktion nicht unterstützt wird ...
Die Zip-Datei-Komponente, die in XE2 eingebaut ist, wird dies tun.
Es gibt eine überladene Methode Open
, die ein TStream
als Eingabeparameter erhält.
Um einzelne Dateien zu extrahieren, können Sie eine überladene Methode Read
aufrufen, die den Namen der Datei, die Sie extrahieren möchten, übergibt. Die extrahierte Datei wird als neue Instanz von TStream
zurückgegeben. Sie können CopyFrom
für diese Instanz verwenden, um die extrahierte Datei in Ihren Stream zu übertragen.
Beachten Sie, dass ich diesen Code nicht getestet habe. Ich habe ihn nur basierend auf dem Quellcode für TZipFile
und der Dokumentation in diesem Quellcode geschrieben. Es kann ein paar Falten in diesem sein, aber wenn der Code sich wie angekündigt verhält, erfüllt es Ihre Bedürfnisse perfekt.
Okay, jetzt habe ich es getestet, weil ich neugierig war. Hier ist das Programm, das zeigt, dass alles wie angekündigt funktioniert:
%Vor% Beachten Sie, dass ich den Index anstelle des Dateinamens extrahiert habe, da dies für mich bequemer war. Und ich habe Dateiströme anstelle von Speicher-Streams verwendet, von denen ich mir vorstelle, dass Sie sie verwenden würden. Da die TZipFile
-Methoden jedoch mit TStream
arbeiten, bin ich mir sicher, dass der Code mit Streams beliebiger Form funktioniert.
Dies ist der letzte einer Reihe von Fragen zu ZIP-Dateien. Ich weiß, dass Sie XE2 verwenden, und ich frage mich, warum Sie zögern, die eingebaute ZIP-Klasse zu verwenden, die XE2 bietet. Ich habe nichts gesehen, um anzuzeigen, dass es Ihren Anforderungen nicht entspricht. Tatsächlich ist es genau diese Fähigkeit, direkt mit Streams zu arbeiten, die mir das Gefühl gibt, dass sie für jede Anwendung ausreichend allgemeingültig ist.