2012-09-12 5 views
5

Das zip-Dateiformat endet mit einem zentralen Verzeichnisabschnitt, der dann auf die einzelnen zip-Einträge in der Datei verweist. Dies scheint zu ermöglichen, dass Zip-Einträge irgendwo innerhalb der Zip-Datei selbst auftreten. In der Tat sind selbstextrahierende Zip-Dateien ein gutes Beispiel: Sie beginnen mit einer ausführbaren Datei, und alle ZIP-Einträge treten nach den ausführbaren Bytes auf.Können ZIP-Dateien spärlich/nicht zusammenhängend sein?

Die Frage ist: erlaubt das Zip-Dateiformat wirklich spärliche oder nicht zusammenhängende zip-Einträge? z.B. Wenn zwischen den Zip-Einträgen leere oder anderweitig nicht erfasste Bytes vorhanden sind? Sowohl der endgültige PK-Hinweis als auch der Wikipedia-Artikel scheinen dies zu ermöglichen. Funktionieren alle/die meisten typischen Zip-Dienstprogramme mit solchen spärlichen Zip-Dateien?

Der Anwendungsfall ist dies: Ich möchte Zip-Einträge in einer Zip-Datei löschen oder ersetzen können. Um dies zu tun, möchten die typischen Minizip-Bibliotheken, dass Sie die gesamte Zip-Datei kopieren, während Sie die gelöschte oder ersetzte Zip-Datei nicht kopieren, was verschwenderisch und langsam erscheint.

Wäre es nicht besser zu überzuordnen, sagen 1,5x der Speicher für einen Eintrag, dann wenn Sie einen Eintrag löschen oder ersetzen, könnten Sie herausfinden, wo die nicht zugeordneten Bytes waren und diese direkt verwenden? Wenn der ZIP-Eintrag linear anwächst, bedeutet dies, dass die Neuzuweisung bei Verwendung von 1,5x linear erfolgen sollte. Es wäre ähnlich der Dateisystemblockzuweisung, obwohl es wahrscheinlich nicht so ausgefeilt ist.

Dies hilft auch mit vielen der zip-basierten Dateiformate da draußen. Anstatt ein temporäres Verzeichnis irgendwo (oder sogar im Speicher) mit den temporär entpackten Dateien zum Editieren/Ändern zu haben und dann das Los wieder in das Dateiformat zu zippen, würde dies die Notwendigkeit, Teile der Zip wieder zu öffnen und neu zu schreiben, verringern Datei.

Gibt es irgendwelche C/C++ - Bibliotheken, die das tun?

+1

Überschüssiger Speicher verhindert nicht den Zweck der Komprimierung? –

+0

zip-Datei ist nicht das beste Medium für die dynamische Speicherverwaltung. es ist Archiv. Zip Ihre Daten zusammen und fertig. –

+0

Einige Daten z.B. Englischer Text oder XML, könnte bis zu 10x komprimiert werden. Eine Überallokalisierung von nur 0,5x zusätzlichem Speicherplatz würde sich immer noch lohnen, wenn die gesamte Zip-Datei nicht neu geschrieben werden könnte. Diese Überbelegung könnte auf einer API-Ebene bestimmt werden, so dass z.B. Einträge, von denen bekannt ist, dass sie nicht in ihrer Größe zunehmen, können gerade genug Platz zugewiesen werden. –

Antwort

4

Nein. Das Lesen des zentralen Verzeichnisses ist optional. zip-decoder können die zip-datei von anfang an einfach lesen und erwarten, dass die lokalen header und eintragungsdaten zusammenhängend angezeigt werden. Sie können den Vorgang der Entschlüsselung abschließen, ohne jemals das zentrale Verzeichnis angeschaut zu haben.

Um zu tun, was Sie wollen, müssen Sie Dummy-Zip-Einträge zwischen den nützlichen Einträgen einfügen, um diesen Platz zu halten. Zumindest wenn du mit dem Rest der Zip-Welt kompatibel sein willst.

+0

Was würde einen solchen Zip-Decoder auf einer nicht-zusammenhängenden Zip-Datei ausführen (unter der Annahme, dass es keine Pseudo-Zip-Einträge gibt)? Wenn der Decoder sequentiell die Zip-Datei nach der magischen Nummer des Zip-Eintrags scannt und dann den Eintrag decodiert, um zu bestimmen, wie lange die Daten tatsächlich sind, würde es so aussehen, als wäre die nicht zusammenhängende Zip-Datei immer noch kompatibel. Die einzige Einschränkung wäre, dass ich den leeren Raum auf Null setzen müsste, um zu verhindern, dass irrtümliche magische Zahlen den Decoder verwirren. –

+0

Der Decoder sucht nicht nach einer magischen Nummer. Es erwartet, dass das nächste, was es sehen wird, eine magische Zahl ist, die anzeigt, ob es sich um einen lokalen Header, einen zentralen Verzeichniskopf oder einen Endkopf handelt. Wenn Nullen angezeigt werden, wird es direkt mit einem ungültigen Formatfehler beendet. –

+0

Am Ende habe ich meine eigene Objective-C-Bibliothek geschrieben, um das Reiben durchzuführen. Die ZIP-Einträge werden nicht als spärliche Einträge behandelt, aber das Schreiben von ZIP-Einträgen, die nicht geändert wurden, wird übersprungen.Wenn Sie also die letzten Einträge ständig ändern, müssen Sie nicht dafür bezahlen, alle Einträge von Anfang an neu zu schreiben. https://github.com/pixelglow/zipzap –

Verwandte Themen