如何实现一个压缩追加的功能?求大佬们给点思路

2022-01-18 17:49:20 +08:00
 opency

平时开发会有部分场景都是需要压缩,但是每次有新增时就要重新进行压缩,所以就想着是不是能够向一个压缩包中追加文件来节约性能。目前网上的文章都搜不到,特来此寻求帮助(花花)

2265 次点击
所在节点    程序员
16 条回复
matrix67
2022-01-18 17:57:32 +08:00
tar archive
tar extension, you can use the -r (or –append) option of the tar command to add/append a new file to the end of the archive. You can use the -v option to have a verbose output to verify the operation. The other option that can be used with the tar command is -u (or –update).Jun 8, 2013
wangxn
2022-01-18 17:58:52 +08:00
ZIP/RAR 这些格式默认就支持往里边添加或者删除文件吧。
像 LZMA 或者 RAR 的固实压缩就不行,算法差异。
opency
2022-01-18 18:03:16 +08:00
@matrix67
@wangxn
感谢解答
ruanimal
2022-01-18 19:49:17 +08:00
@matrix67 tar 不是打包吗,没有压缩功能吧,tar.gz 的话估计也是全量压的
kokutou
2022-01-18 19:54:01 +08:00
就一直压到新的压缩包里吧,然后给个功能,手动重压缩打包。
ysc3839
2022-01-18 19:55:40 +08:00
@wangxn @ruanimal gz 和 lzma 是流式压缩的,理论上可行吧?
yfugibr
2022-01-18 19:57:30 +08:00
.zip.tar
对每个部分独立压缩,再拼起来
jim9606
2022-01-18 20:57:02 +08:00
zip 就可以,很多 zip 读写库都支持在线修改,追加和修改都可以(但删除就不一定支持了)
另外友情提醒,zip 的压缩算法除了 store(不压缩)和 deflate 外还能用 lzma ,甚至可以用牛逼的 zstd (好像已经被 PKWARE 标准化,至少 7-zip 可以创建这种 zip 档案)
aloxaf
2022-01-18 21:18:31 +08:00
本来还是为是往已压缩文件中追加数据,没想到是往压缩包内追加完整文件

——只要你没在用 tar ,那么只要关闭「固实压缩」,就能避免在追加内容时重新压缩
Izual_Yang
2022-01-18 23:49:58 +08:00
差量备份?
或者就干脆新增 /修改部分另压新包?
zhangenming
2022-01-19 00:31:15 +08:00
增量压缩 结果肯定没有 重新做一次完整压缩 的压缩效率高吧
增量的时候字典应该也是增量的
mingl0280
2022-01-19 00:35:24 +08:00
固实压缩不可追加,除此之外都可以追加。
Trim21
2022-01-19 00:36:40 +08:00
zip 文件就可以,每次追加文件只需要重写文件尾很小的一部分内容,写完了所有要添加的文件再写一个新的文件尾。
DiamondYuan
2022-01-19 01:32:12 +08:00
这个我熟。之前读了 tar 和 gzip 的 rfc 。

1. gzip 文件可以任意合并

可以把一个大文件拆分成两个文件,分别压缩后拼起来,解压后就是原来的大文件

2. 任意的两个 tar 文件可以直接连接起来。a.tar 和 b.tar (需要删除 a.tar 末尾的空白即可)



利用上面的原理,每次只需要

1. tar 打包文件
2. 去掉末尾空白
3. gzip

以后,就可以追加到之前的压缩包了
iqoo
2022-01-19 10:36:54 +08:00
任何流压缩都支持。比如网站 gzip/br 就是边压缩边返回的。

想同时满足压缩率的话,设置一个较大的窗口,缓冲区写满才压缩追加。
alexsunxl
2022-01-19 16:19:29 +08:00
@matrix67 tar 只是打包,不是压缩。把多个小文件归档成一个 tar 包。
一般配合 zip br gz ,归档后压缩。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/829049

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX