基于DEFLATE开发类gzip压缩软件时能否整量读取文件夹数据压缩?
问题解答
整量压缩目录并还原结构的可行性
完全可以实现。你只需要在压缩数据流的头部新增一段序列化的元数据,存储完整的目录树信息(包含所有文件/目录的路径、大小、权限、修改时间、数据偏移量等属性),再将所有文件的原始二进制数据按顺序拼接为连续的数据流,统一送入DEFLATE算法压缩即可。
解压时先读取头部元数据解析出原始目录结构,再将解压后的连续二进制流按元数据标注的长度、偏移量拆分,对应写入对应路径的文件,自动创建缺失的目录即可还原全部结构。
整量压缩对压缩率的影响
绝大多数场景下会带来压缩率增益,增益幅度和目录内的文件特征强相关:
- DEFLATE算法的核心LZ77模块依赖滑动窗口匹配重复内容片段实现压缩,逐文件压缩时每个文件的滑动窗口独立重置,跨文件的重复内容无法被识别;整量压缩时所有文件内容属于同一个连续数据流,跨文件的重复片段可以被匹配编码,冗余消除范围更大。
- 如果目录内存在大量小文件、或者多个文件存在同源的重复内容片段(比如多个同版本的代码文件、相似的文档),整量压缩的增益会非常明显;如果目录内只有单个超大文件,整量压缩和逐文件压缩的压缩率基本无差异。
现有实现的代表软件
这类整量压缩逻辑已经非常成熟,主流压缩工具均有相关实现:
tar+gzip组合:也就是常见的.tar.gz/.tgz格式,tar工具负责将目录+元数据打包为单一流,再调用gzip做DEFLATE压缩,是类Unix系统最常用的目录压缩方案- 7-Zip:
.7z格式默认开启固实压缩模式,本质就是将所有文件视为单一流做压缩,选择DEFLATE算法时就是你描述的方案 - WinRAR:
.rar格式默认采用固实压缩逻辑处理多文件/目录,也支持手动调整固实压缩的块大小 - 常规ZIP格式:也支持手动开启固实压缩选项,默认是逐文件压缩,开启后即可实现整量压缩效果。
内容的提问来源于stack exchange,提问作者Raiden1916
相关产品推荐
相关产品推荐

