2017-12-28 5 views
0

Ich arbeite gerade an einem Node.js Projekt. Ich möchte eine ZIP-Datei lesen, ändern und schreiben können, ohne sie in FS zu speichern (wir erhalten sie per TCP und senden sie zurück, nachdem Änderungen vorgenommen wurden), und bis jetzt sieht es so aus, als wäre die einfache ZIP-Dateistruktur möglich. Zur Zeit beziehe ich mich auf this documentation.ZIP-Dateiformat. Wie lese ich die Datei richtig?

So ZIP-Datei hat einfache Struktur:

File header 1 
File data 1 
File data descriptor 1 

File header 2 
File data 2 
File data descriptor 2 

... 

[other not important yet] 

Zuerst müssen wir Datei-Header lesen, das Feld enthält compressed size, und es könnte der perfekte Weg, um file data 1 von ihrer Gesamtlänge zu lesen. Aber es ist eigentlich nicht. Dieses Feld kann "0" oder "0xFFFFFFFF" enthalten, und diese Werte beschreiben nicht die tatsächliche Länge. In diesem Fall müssen wir Dateidaten ohne Informationen über ihre Länge lesen. Aber wie?

Compression/Decopression Algorithmus Beschreibungen sieht ziemlich komplex für mich, und ich plane, ZLIB für die Komprimierung selbst sowieso zu verwenden. Also wenn da etwas Nützliches beschrieben wird, dann habe ich den Punkt verpasst.

Kann jemand den richtigen Weg erklären, diese Dateien zu lesen?

P.S. Bitte vermeiden Sie, npm-Module vorzuschlagen. Ich möchte nicht nur das Problem lösen, sondern auch verstehen, wie die Dinge funktionieren.

Antwort

0

Hinweis - ich nehme an, dass Sie die Zip-Datei als es aus der Steckdose kommt lesen und verarbeiten wollen, anstatt die komplette Zip-Datei in Speicher vor der Verarbeitung zu lesen. Beide Optionen sind gültig.

Ich würde zunächst die Anwendungsfälle ignorieren, in denen compressed size einen Wert von '0' oder '0xFFFFFFFF' hat. Ersteres ist nur in Zip-Dateien vorhanden, die im Streaming-Modus erstellt wurden, letzteres für Zip-Dateien, die größer als 4Gig sind.

Der Umgang mit ihnen fügt eine Menge Komplexität hinzu - Sie können später Unterstützung hinzufügen, falls erforderlich. Ob Sie jemals die Anwendungsfälle 0/0xFFFFFFFF unterstützen müssen, hängt von der Art der ZIP-Dateien ab, die Sie verarbeiten möchten.

Wenn die compression methoddeflated (8) ist, verwenden Sie zlib für die Komprimierung/Dekomprimierung. Sie müssen auch compression methodstored (0) unterstützen. Es wird für sehr kleine Dateien verwendet, für die eine Komprimierung nicht geeignet ist.