Estrutura geral

Estrutura geral

Eu tenho 4 perguntas:

  1. É possível escanear todo o arquivo zip e navegar dentro dele sem extrair todo o zip usando PHP?
  2. Será eficiente em termos de tempo? ou seja, eu tenho um arquivo zip de cerca de 50 GB que consiste em muitos arquivos pequenos (especialmente muitas imagens anteriores) e quero usar PHP para criar um explorador de arquivos.
  3. Isso pode ser feito recursivamente, ou seja, se eu tiver muitos zips dentro de um zip grande, poderei analisá-los?
  4. Se eu puder analisar o zip, isso significa que posso abrir arquivos dentro dele como em um navegador de arquivos normal?

Responder1

Provavelmente. Uma simples pesquisa no Google apareceuesse. Parece que há suporte total para arquivos Zip.

Responder2

Sim para tudo. Pelo menos se"digitalizar todo o arquivo zip"não significa realmente verificar o arquivo inteiro. Se for pequeno não importa, mas se for enorme sim.

Resumindo, os arquivos ZIP são construídos de forma que seja possível listar, atualizar, remover, adicionar arquivos sem ler o arquivo inteiro. Observe também que originalmente o ZIP era frequentemente usado para salvar discos que podiam abranger vários discos. Em outras palavras, você pode ter um arquivo zip começando no disco nº 1 e terminando no disco nº 44.

O fato de não ser necessário o disco nº 1 - o disco nº 28 para extrair o arquivo 342 no disco nº 29 também se aplica se o arquivo estiver em um disco, mas conceitualmente talvez seja mais fácil de entender. Você não lê o arquivo nº 1 para o arquivo nº 341 para extrair o arquivo nº 342.

Deixando isso de lado, em resumo, um arquivo ZIP termina com um Diretório Central. Este diretório contém informações sobre o estado atual do arquivo zip e é o que deve ser usado.


Estrutura geral

A estrutura geral de um arquivo zip é normalmente (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

Mas arquivos ZIP"permitir"para dados não arquivados, bem como excluir e adicionar entradas (onde a remoção dos dados não é um requisito).

Allow é usado de forma bastante flexível aqui

Portanto, um arquivo poderia ser algo assim:

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

Aqui temos um cenário onde os dados foram adicionados entre alguns dos registros, o Arquivo 2 foi excluído, mas os dados não foram removidos, o Arquivo 4 foi adicionado e um novo Diretório Central foi escrito sem remover o antigo.

Na verdade, é possível anexar um arquivo zip a qualquer arquivo existente e ele ainda poderá ser usado.

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

Pode-se chamar o arquivo de uma grande bagunça, mas como um arquivo ZIP ele ainda é legível. Pode-se argumentar que não é válido por especificação e ignorá-lo de bom grado, mas isso é outra história.

Ponto sendo:

Um leitor ZIP adequado usa o último Diretório Central. Este deve sempre conter informações sobre o estado atual do arquivo. Ele fornece informações sobre nome do arquivo, hora, data, método de compactação, início do disco, fim do disco, número de arquivos, onde cada arquivo começa e termina, soma de verificação para cada arquivo, etc.

Pode-se olhar para um arquivo zip como uma enorme bolha de dados onde o CD diz onde cada arquivo começa e termina ++.


Em geral

A maioria dos arquivos zip são, obviamente, muito mais limpos do que isso, mas apenas para dar um pouco de contexto.

Resumindo: Para obter uma visão geral dos arquivos no arquivo, basta ler o CD. Por isso pode-se listar, por exemplo:

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

O cabeçalho do arquivo local pode ser útil ao recuperar um arquivo corrompido ou quando o CD está faltando, etc., mas também pode estar faltando. Normalmente contém o tamanho dos dados do arquivo, mas nem sempre. Se isso não acontecer, normalmente é

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

então você acaba tendo o problema de adivinhar onde os dados começam e terminam caso você leia o arquivo do byte 0.

Uma razão típica para isso é que o ZIP pode arquivar fluxos de dados. Assim, não se sabe o tamanho do arquivo, nem a soma de verificação, antes de ser escrito e o cabeçalho pode, como resultado, não conter esta informação. Lembre-se também aqui de que um arquivo pode abranger vários discos. O tamanho deve, no entanto, ser sempre adicionado ao CD.


Como é possível ler onde um arquivo começa e termina, também é fácil escolher um arquivo. Se o CD disser que um arquivo começa no deslocamento 632156 e termina em 952144, leia esses bytes e, se estiver compactado, descompacte-o adequadamente.

Se você tiver arquivos aninhados, arquivos dentro de arquivos, dentro de arquivos, ... cada arquivo precisaria ser procurado e analisado seu respectivo CD.

Nota:Fácilé relativo aqui, é claro.

Fim do registro do diretório central

Assim como um arquivo pode abranger vários discos, o CD também pode. OFim do registro do diretório centralcontém informações sobre qual disco o CD inicia e termina. Hoje em dia geralmente é o mesmo disco, mas uma observação importante e mais fácil de entender se decidirmos observar o formato a partir das especificações.

Há (é claro) muito mais nisso. Tudo dependendo do que se deseja apoiar. Por exemplo, os dados podem ser criptografados.

Para uma leitura completa confiraAPPNOTE.TXT

Conhecer o básico de como um arquivo ZIP é construído torna mais fácil saber o que você pode e o que não pode fazer ao usar bibliotecas como PHP Zip.


Zip PHP

Nunca usei, mas pelo que parece tem todos os recursos que você precisa.Adivinharele não lê os dados do arquivo até ser solicitado. Dê uma olhada no Exemplo # 2 aqui, por exemplo:https://www.php.net/manual/en/zip.examples.php

Teste em um arquivo grande e cronometre. Se ele ler apenas CD, deverá ser relativamente rápido, mesmo em arquivos grandes.


Já escrevi um analisador ZIP para me divertir, mas essa é uma história totalmente diferente, hah.

informação relacionada