ZIP文件

一、文件结构

1、Local File Header — 每个压缩文件开头的本地头,包含文件名、压缩方式、CRC校验等

2、Compressed Data — 实际的压缩数据

3、End of Central Directory Record (EOCDR) — 最末尾的一条记录,相当于”目录索引”,记录了:
– 这个zip里有多少个文件
– 每个文件在zip里的偏移位置
– 压缩前后的文件大小
– 文件名列表


二、解压过程

第一步:定位EOCDR

unzip从文件末尾往前搜索,找到End of Central Directory Record签名(PK\x05\x06)。EOCDR固定在最末尾,长度不固定但通常很小(几十到几百字节)。

第二步:读取Central Directory

EOCDR里记录了Central Directory(中央目录)在文件中的偏移位置和大小。unzip跳到那个位置,逐个读取每个文件的Central Directory Entry,得到:

第三步:逐个解压文件

对每个文件:

  • 根据偏移找到Local File Header
  • 读取压缩数据
  • 按压缩方式解压(最常用是deflate)
  • 用CRC32校验解压后的数据是否完整
  • 写入磁盘