一、文件结构
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校验解压后的数据是否完整
- 写入磁盘