Estructura general

Estructura general

Tengo 4 preguntas:

  1. ¿Es posible escanear todo el archivo zip y navegar dentro de él sin extraer todo el zip usando PHP?
  2. ¿Será eficiente en términos de tiempo? es decir, tengo un archivo zip de aproximadamente 50 GB que consta de muchos archivos pequeños (especialmente muchas imágenes anteriores) y quiero usar PHP para crear un explorador de archivos.
  3. ¿Se puede hacer esto de forma recursiva, es decir, si tengo muchos zips dentro de un zip grande, podré analizarlos?
  4. Si puedo analizar el zip, ¿significa que puedo abrir archivos dentro como lo hago en un explorador de archivos normal?

Respuesta1

Probablemente. Apareció una simple búsqueda en Google.este. Parece que hay soporte total para archivos Zip.

Respuesta2

Sí a todo. al menos si"escanear todo el archivo zip"no significa realmente escanear todo el archivo. Si es pequeño no importa, pero si es enorme sí.

En resumen, los archivos ZIP están construidos de una manera que permite enumerar, actualizar, eliminar y agregar archivos sin leer el archivo completo. También tenga en cuenta que originalmente ZIP se usaba a menudo para guardar discos que podían abarcar varios discos. En otras palabras, puede tener un archivo zip que comience en el disco n.° 1 y termine en el disco n.° 44.

El hecho de que no se necesite el disco n.° 1 - disco n.° 28 para extraer el archivo 342 en el disco n.° 29 también se aplica si el archivo está en un disco, pero conceptualmente tal vez sea más fácil de entender. No lee el archivo n.° 1 al archivo n.° 341 para extraer el archivo n.° 342.

Aparte de eso, en resumen, un archivo ZIP termina con un directorio central. Este directorio contiene información sobre el estado actual del archivo zip y es lo que se debe utilizar.


Estructura general

La estructura general de un archivo zip suele ser (simplificada):

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

Pero los archivos ZIP"permitir"para datos que no están archivados, así como para eliminar y agregar entradas (donde eliminar los datos no es un requisito).

Permitir se usa de manera bastante flexible aquí

Entonces un archivo podría ser algo como esto:

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

Aquí tenemos un escenario en el que se agregaron datos entre algunos de los registros, se eliminó el Archivo 2, pero los datos no se eliminaron, se agregó el Archivo 4 y se escribió un nuevo Directorio Central sin eliminar el anterior.

De hecho, se puede agregar un archivo zip a cualquier archivo existente y aún se puede utilizar.

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

Se podría decir que el archivo es un gran desastre, pero como archivo ZIP aún es legible. Se puede argumentar que no es válido según las especificaciones e ignorarlo voluntariamente, pero esa es otra historia.

El punto es:

Un lector ZIP adecuado utiliza el último directorio central. Este siempre debe contener información sobre el estado actual del archivo. Proporciona información sobre el nombre del archivo, hora, fecha, método de compresión, inicio y fin del disco, número de archivos, dónde comienza y termina cada archivo, suma de comprobación para cada archivo, etc.

Uno puede ver un archivo zip como una enorme masa de datos donde el CD dice dónde comienza y termina cada archivo ++.


En general

La mayoría de los archivos zip son, por supuesto, mucho más limpios que este, pero sólo para dar un poco de contexto.

En resumen: para obtener una descripción general de los archivos del archivo, todo lo que hay que hacer es leer el CD. Por esto se puede enumerar por ejemplo:

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

El encabezado del archivo local puede ser útil al recuperar un archivo dañado, o cuando falta un CD, etc., pero también puede faltar. Normalmente contiene el tamaño de los datos del archivo, pero no siempre. Si no es así, normalmente es

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

por lo que termina con el problema de tener que adivinar dónde comienzan y terminan los datos en caso de que lea el archivo desde el byte 0.

Una razón típica para esto es que ZIP puede archivar flujos de datos. Por lo tanto, uno no sabe el tamaño del archivo, ni la suma de verificación, antes de escribirlo y, como resultado, el encabezado puede no contener esta información. También aquí recuerda que un archivo puede abarcar varios discos. Sin embargo, el tamaño siempre debe añadirse al CD.


Como se puede leer dónde comienza y termina un archivo, también es bastante fácil seleccionar un archivo. Si el CD dice que un archivo comienza en el desplazamiento 632156 y termina en 952144, lea esos bytes y, si están comprimidos, descomprímalos en consecuencia.

Si tiene archivos anidados, archivos dentro de archivos, dentro de archivos, ... será necesario buscar cada archivo en su respectivo CD analizado.

Nota al margen:FácilEs relativo aquí, por supuesto.

Fin del registro del directorio central

Así como un archivo puede abarcar varios discos, también puede hacerlo el CD. ElFin del registro del directorio centralcontiene información en qué disco comienza y finaliza el CD. Hoy en día suele ser el mismo disco, pero es una nota importante y más fácil de entender si uno decide mirar el formato a partir de las especificaciones.

Hay (por supuesto) mucho más en esto. Todo dependiendo de lo que uno quiera apoyar. Por ejemplo, ¿se pueden cifrar los datos?

Para una lectura completa echa un vistazoNOTA DE APLICACIÓN.TXT

Conocer los conceptos básicos de cómo se construye un archivo ZIP hace que sea más fácil saber qué se puede hacer y qué no cuando se utilizan bibliotecas como PHP Zip.


PHP zip

Nunca lo he usado, pero por lo que parece tiene todas las funciones que necesitas.Adivinarno lee los datos del archivo hasta que se le solicita. Eche un vistazo al ejemplo n.º 2 aquí, por ejemplo:https://www.php.net/manual/en/zip.examples.php

Pruebe en un archivo grande y cronometre. Si sólo lee CD, debería ser relativamente rápido incluso en archivos grandes.


Una vez escribí un analizador ZIP por diversión, pero esa es una historia completamente diferente, ja.

información relacionada