전체 구조

전체 구조

질문이 4개 있습니다:

  1. PHP를 사용하여 전체 zip 파일을 추출하지 않고도 전체 zip 파일을 스캔하고 내부를 탐색할 수 있습니까?
  2. 시간 효율적일까요? 즉, 나는 많은 작은 파일(특히 과거의 많은 이미지)로 구성된 약 50GB의 zip 파일을 가지고 있으며 PHP를 사용하여 파일 탐색기를 만들고 싶습니다.
  3. 이 작업을 재귀적으로 수행할 수 있습니까? 즉, 큰 zip 안에 많은 zip이 있는 경우 이를 구문 분석할 수 있습니까?
  4. zip을 구문 분석할 수 있다면 일반 파일 브라우저에서처럼 내부에서 파일을 열 수 있다는 뜻인가요?

답변1

아마. 간단한 구글 검색 결과가 나왔습니다이것. Zip 아카이브가 완벽하게 지원되는 것 같습니다.

답변2

모두 예. 적어도 만약에"전체 zip 파일을 스캔하세요"실제로 전체 파일을 스캔한다는 의미는 아닙니다. 작다면 상관없지만 크면 그렇습니다.

간단히 말해서 ZIP 파일은 전체 파일을 읽지 않고도 파일 나열, 업데이트, 제거, 추가가 가능한 방식으로 구축되었습니다. 또한 원래 ZIP은 여러 디스크에 걸쳐 있을 수 있는 디스크를 저장하는 데 자주 사용되었습니다. 즉, 디스크#1에서 시작하여 디스크#44에서 끝나는 zip 파일을 가질 수 있습니다.

디스크 #29에서 파일 342를 추출하기 위해 디스크 #1 - 디스크 #28이 필요하지 않다는 사실은 파일이 하나의 디스크에 있는 경우에도 적용되지만 개념적으로는 이해하기 더 쉽습니다. 파일#342를 추출하기 위해 파일#1부터 파일#341까지 읽어오지 않습니다.

간단히 말해서 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 아카이브를 CD에 각 파일이 시작하고 끝나는 위치를 알려주는 거대한 데이터 덩어리로 볼 수 있습니다++.


일반적으로

물론 대부분의 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도 마찬가지입니다. 그만큼중앙 디렉터리 레코드의 끝CD가 시작되고 끝나는 디스크에 대한 정보를 보유합니다. 요즘에는 일반적으로 동일한 디스크이지만 중요한 참고 사항이며 사양에서 형식을 살펴보기로 결정하면 이해하기가 더 쉽습니다.

(물론) 여기에는 더 많은 것이 있습니다. 모두 지원하려는 항목에 따라 다릅니다. 예를 들어 데이터를 암호화할 수 있습니다.

전체 내용을 보려면 체크아웃하세요.앱노트.TXT

ZIP 아카이브가 어떻게 구축되는지에 대한 기본 사항을 알면 PHP Zip과 같은 라이브러리를 사용할 때 무엇을 할 수 있고 무엇을 할 수 없는지 더 쉽게 알 수 있습니다.


PHP 우편번호

한번도 사용해본 적은 없지만, 외관상 필요한 모든 기능을 갖추고 있습니다.추측하다요청될 때까지 파일 데이터를 읽지 않습니다. 예를 들어 여기 예제 #2를 살펴보세요.https://www.php.net/manual/en/zip.examples.php

대규모 아카이브를 테스트하고 시간을 측정하세요. CD만 읽는다면 대용량 아카이브에서도 비교적 빠른 속도를 보일 것입니다.


재미로 ZIP 파서를 작성한 적이 있지만 그것은 완전히 다른 이야기입니다. 하하.

관련 정보