Общая структура

Общая структура

У меня 4 вопроса:

  1. Можно ли сканировать весь zip-файл и перемещаться по нему, не извлекая весь zip-файл, с помощью PHP?
  2. Будет ли это эффективно по времени? Например, у меня есть zip-файл размером около 50 ГБ, который состоит из множества небольших файлов (особенно множества изображений из прошлого), и я хочу использовать PHP для создания файлового менеджера.
  3. Можно ли это сделать рекурсивно, т.е. если у меня много zip-файлов внутри большого zip-файла, смогу ли я их разобрать?
  4. Если я могу разобрать zip-архив, значит ли это, что я могу открывать файлы внутри него, как в обычном файловом браузере?

решение1

Вероятно. Простой поиск в Google выдалэтот. Похоже, что есть полная поддержка Zip-архивов.

решение2

Да всем. По крайней мере, если"сканировать весь zip-файл"не означает, что нужно сканировать весь файл. Если файл маленький, то неважно, но если он огромный, то да.

Короче говоря, ZIP-файлы построены таким образом, что позволяют перечислять, обновлять, удалять, добавлять файлы без чтения всего файла. Также обратите внимание, что изначально ZIP часто использовался для сохранения на дисках, которые могли охватывать несколько дисков. Другими словами, у вас может быть zip-файл, начинающийся на диске №1 и заканчивающийся на диске №44.

Тот факт, что не нужен disk#1 - disk#28 для извлечения файла 342 на disk#29, также применим, если файл находится на одном диске, но концептуально это, возможно, проще понять. Вы не читаете file#1 в file#341 для извлечения file#342.

Если отбросить это в сторону, то ZIP-архив заканчивается Центральным каталогом. Этот каталог содержит информацию о текущем состоянии zip-архива и является тем, что следует использовать.


Общая структура

Общая структура zip-архива обычно выглядит следующим образом (упрощенно):

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

Но ZIP-архивы"позволять"для неархивных данных, а также для удаления и добавления записей (когда удаление данных не является обязательным).

Здесь Allow используется довольно гибко.

Итак, архив может быть примерно таким:

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

Здесь представлен сценарий, в котором данные были добавлены между некоторыми записями, файл 2 был удален, но данные не были удалены, файл 4 был добавлен и новый центральный каталог был записан без удаления старого.

Фактически, можно присоединить zip-архив к любому существующему файлу, и его все равно можно будет использовать.

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

Можно назвать файл огромным беспорядком, но как ZIP-архив он все еще читаем. Можно утверждать, что он недействителен по спецификации, и охотно игнорировать его, но это уже другая история.

Суть в том, что:

Правильный ZIP-ридер использует последний Центральный каталог. Он всегда должен содержать информацию о текущем состоянии архива. Он дает информацию об имени файла, времени, дате, методе сжатия, начале диска, конце диска, количестве файлов, начале и конце каждого файла, контрольной сумме каждого файла и т. д.

ZIP-архив можно рассматривать как огромный массив данных, где на компакт-диске указано, где начинается и заканчивается каждый файл ++.


В общем

Большинство zip-архивов, конечно, намного чище, чем этот, но это только для того, чтобы дать немного контекста.

Короче говоря: Чтобы получить обзор файлов в архиве, достаточно прочитать CD. Так можно составить список, например:

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

Локальный заголовок файла может быть полезен при восстановлении поврежденного файла или при отсутствии CD и т. д., но может также отсутствовать. Обычно он содержит размер данных файла, но не всегда. Если это не так, то обычно

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

Таким образом, в случае чтения файла с байта 0 вам придется угадывать, где начинаются и заканчиваются данные.

Типичная причина этого в том, что ZIP может архивировать потоки данных. Таким образом, невозможно знать размер файла или контрольную сумму до того, как он будет записан, и заголовок может не содержать эту информацию. Также помните, что файл может занимать несколько дисков. Однако размер всегда следует добавлять к CD.


Поскольку можно прочитать, где начинается и заканчивается файл, также достаточно легко выбрать файл. Если CD говорит, что файл начинается со смещения 632156 и заканчивается на 952144, то прочитайте эти байты и, если сжат, распакуйте соответственно.

Если у вас есть вложенные файлы, архивы внутри архивов, внутри архивов, ... каждый архив должен быть просмотрен и проанализирован соответствующим ему CD.

Примечание:Легкийздесь, конечно, все относительно.

Конец записи центрального каталога

Как архив может занимать несколько дисков, так и компакт-диск может.Конец записи центрального каталогасодержит информацию о том, на каком диске начинается и заканчивается CD. В наши дни это обычно тот же диск, но важная заметка, и ее легче понять, если решить взглянуть на формат из спецификаций.

Конечно, есть еще много чего. Все зависит от того, что именно вы хотите поддерживать. Например, можно ли зашифровать данные.

Для полного прочтения ознакомьтесь сAPPNOTE.TXT

Знание основ построения ZIP-архива упрощает понимание того, что можно делать, а что нет, при использовании таких библиотек, как PHP Zip.


PHP-архив

Никогда им не пользовался, но судя по всему, в нем есть все необходимые функции.Предполагатьон не читает данные файла, пока не будет получен запрос. Взгляните на пример №2 здесь, например:https://www.php.net/manual/en/zip.examples.php

Тест на большом архиве и засеките время. Если он читает только CD, то он должен быть относительно быстрым даже на огромных архивах.


Однажды ради забавы написал ZIP-парсер, но это уже совсем другая история, ха-ха.

Связанный контент