Gesamtstruktur

Gesamtstruktur

Ich habe 4 Fragen:

  1. Ist es möglich, die gesamte ZIP-Datei zu scannen und darin zu navigieren, ohne die gesamte ZIP-Datei mit PHP zu extrahieren?
  2. Wird es zeiteffizient sein? Ich habe z. B. eine ZIP-Datei von etwa 50 GB, die aus vielen kleinen Dateien besteht (insbesondere vielen Bildern aus der Vergangenheit), und ich möchte mit PHP einen Datei-Explorer erstellen.
  3. Kann dies rekursiv erfolgen, d. h. wenn ich viele Zips in einem großen Zip habe, kann ich sie dann analysieren?
  4. Wenn ich die ZIP-Datei analysieren kann, bedeutet das, dass ich die darin enthaltenen Dateien wie in einem normalen Dateibrowser öffnen kann?

Antwort1

Wahrscheinlich. Eine einfache Google-Suche ergabDas. Es scheint, als gäbe es volle Unterstützung für Zip-Archive.

Antwort2

Ja zu allem. Zumindest wenn"die gesamte Zip-Datei scannen"bedeutet nicht, dass tatsächlich die gesamte Datei gescannt wird. Wenn sie klein ist, spielt das keine Rolle, aber wenn sie riesig ist, schon.

Kurz gesagt sind ZIP-Dateien so aufgebaut, dass es möglich ist, Dateien aufzulisten, zu aktualisieren, zu entfernen und hinzuzufügen, ohne die gesamte Datei lesen zu müssen. Beachten Sie auch, dass ZIP ursprünglich oft zum Speichern von Datenträgern verwendet wurde, die sich über mehrere Datenträger erstrecken konnten. Mit anderen Worten: Sie können eine ZIP-Datei haben, die auf Datenträger Nr. 1 beginnt und auf Datenträger Nr. 44 endet.

Die Tatsache, dass man nicht Datenträger Nr. 1 bis Datenträger Nr. 28 braucht, um Datei 342 auf Datenträger Nr. 29 zu extrahieren, gilt auch, wenn sich die Datei auf einem Datenträger befindet, aber konzeptionell ist es vielleicht einfacher zu verstehen. Sie lesen nicht Datei Nr. 1 bis Datei Nr. 341, um Datei Nr. 342 zu extrahieren.

Abgesehen davon endet ein ZIP-Archiv kurz gesagt mit einem zentralen Verzeichnis. Dieses Verzeichnis enthält Informationen über den aktuellen Status des ZIP-Archivs und sollte verwendet werden.


Gesamtstruktur

Die Gesamtstruktur eines Zip-Archivs ist typischerweise (vereinfacht):

Local File Header 1
      File Data   1
      Descriptor  1 (optional) 
Local File Header 2
      File Data   2
      Descriptor  2 (optional)
Local File Header N
      File Data   N
      Descriptor  N (optional)

Central Directory
   Details File 1
   Details File 2
   Details File N
   End Of Central Directory

Aber ZIP-Archive"erlauben"für Nichtarchivierungsdaten sowie das Löschen und Hinzufügen von Einträgen (wobei das Entfernen der Daten nicht erforderlich ist).

Allow wird hier eher flexibel verwendet

Ein Archiv könnte also etwa so aussehen:

Local File Header 1
      File Data   1
Local File Header 2
      File Data   2
Non Archive Data    << not part of the archive, but part of the file.
Local File Header 3
      File Data   3
      Descriptor  3
Non Archive Data    << not part of the archive, but part of the file.
Central Directory   << old central directory
   Details File 1
   Details File 2
   End Of Central Directory

Local File Header 4
      File Data   4

Central Directory
   Details File 1
   Details File 3
   Details File 4
   End Of Central Directory

Hier liegt ein Szenario vor, bei dem zwischen einigen Datensätzen Daten hinzugefügt wurden, Datei 2 gelöscht wurde, die Daten jedoch nicht entfernt wurden, Datei 4 hinzugefügt wurde und ein neues zentrales Verzeichnis geschrieben wurde, ohne das alte zu entfernen.

Man kann tatsächlich ein ZIP-Archiv an jede vorhandene Datei anhängen und es ist weiterhin verwendbar.

foo.zip
[GIF IMAGE]
[ZIP FILE RECORD]
[LETTER TO MOM]
[ZIP FILE RECORD]
[CENTRAL DIRECTORY]

Man könnte die Datei als großes Durcheinander bezeichnen, aber als ZIP-Archiv ist sie immer noch lesbar. Man könnte argumentieren, dass sie laut Spezifikation nicht gültig ist, und es bereitwillig ignorieren, aber das ist eine andere Geschichte.

Der Punkt ist:

Ein guter ZIP-Reader verwendet das letzte zentrale Verzeichnis. Dieses sollte immer Informationen über den aktuellen Status des Archivs enthalten. Es enthält Informationen über Dateiname, Zeit, Datum, Komprimierungsmethode, Disk-Start, Disk-Ende, Anzahl der Dateien, wo jede Datei beginnt und endet, Prüfsumme für jede Datei usw.

Man kann ein ZIP-Archiv als einen riesigen Datenblock betrachten, bei dem auf der CD steht, wo jede Datei beginnt und endet ++.


Allgemein

Die meisten ZIP-Archive sind natürlich viel sauberer als dieses, aber nur um ein wenig Kontext zu geben.

Kurz gesagt: Um einen Überblick über die Dateien im Archiv zu bekommen, genügt es, die CD zu lesen. Damit kann man sich beispielsweise auflisten lassen:

file1 date size_compressed size_uncompressed
file2 date size_compressed size_uncompressed
file3 date size_compressed size_uncompressed
file4 date size_compressed size_uncompressed

Der lokale Dateiheader kann nützlich sein, wenn eine beschädigte Datei wiederhergestellt wird oder wenn eine CD fehlt usw., kann aber auch fehlen. Normalerweise enthält er die Größe der Dateidaten, aber nicht immer. Wenn dies nicht der Fall ist, ist es normalerweise

Local File Header
  ...
  size_compressed: 0
  size_uncompressed: 0
  ...
File Data
Descriptor
   size_compressed: 3214
   size_uncompressed: 6128

Sie stehen also vor dem Problem, dass Sie raten müssen, wo die Daten beginnen und enden, wenn Sie die Datei ab Byte 0 lesen.

Ein typischer Grund hierfür ist, dass ZIP Datenströme archivieren kann. Somit kennt man weder die Größe der Datei noch die Prüfsumme, bevor sie geschrieben wird und der Header kann diese Information daher nicht enthalten. Bedenken Sie auch hier, dass eine Datei mehrere Platten umfassen kann. Die Größe sollte jedoch immer auf CD angegeben werden.


Da man lesen kann, wo eine Datei beginnt und endet, ist es auch ganz einfach, eine Datei herauszupicken. Wenn CD beispielsweise angibt, dass eine Datei bei Offset 632156 beginnt und bei 952144 endet, dann liest man diese Bytes und dekomprimiert sie entsprechend, falls sie komprimiert ist.

Wenn Sie verschachtelte Dateien oder Archive in Archiven haben, müssen Sie in jedem Archiv nachschlagen und die jeweilige CD analysieren.

Randnotiz:Einfachist hier natürlich relativ.

Ende des zentralen Verzeichniseintrags

Da ein Archiv mehrere Datenträger umfassen kann, kann dies auch für die CD gelten.Ende des zentralen Verzeichniseintragsenthält Informationen darüber, mit welcher CD die CD beginnt und endet. Heutzutage ist es normalerweise dieselbe CD, aber ein wichtiger Hinweis und leichter zu verstehen, wenn man sich entscheidet, das Format anhand der Spezifikationen zu betrachten.

Es gibt (natürlich) noch viel mehr dazu. Alles hängt davon ab, was unterstützt werden soll. Können die Daten beispielsweise verschlüsselt werden?

Den vollständigen Text finden Sie unterAPPNOTE.TXT

Wenn Sie die Grundlagen des Aufbaus eines ZIP-Archivs kennen, wissen Sie leichter, was Sie tun können und was nicht, auch wenn Sie Bibliotheken wie PHP Zip verwenden.


PHP Zip

Habe es noch nie benutzt, aber es sieht so aus, als ob es alle Funktionen hat, die man braucht.ErratenDie Dateidaten werden erst gelesen, wenn dies verlangt wird. Sehen Sie sich beispielsweise Beispiel Nr. 2 hier an:https://www.php.net/manual/en/zip.examples.php

Testen Sie es an einem großen Archiv und messen Sie die Zeit. Wenn es nur CDs liest, sollte es auch bei riesigen Archiven relativ schnell gehen.


Habe einmal zum Spaß einen ZIP-Parser geschrieben, aber das ist eine ganz andere Geschichte, haha.

verwandte Informationen