![向 zip 文件中添加文件是否会重写整个文件?](https://linux22.com/image/1615640/%E5%90%91%20zip%20%E6%96%87%E4%BB%B6%E4%B8%AD%E6%B7%BB%E5%8A%A0%E6%96%87%E4%BB%B6%E6%98%AF%E5%90%A6%E4%BC%9A%E9%87%8D%E5%86%99%E6%95%B4%E4%B8%AA%E6%96%87%E4%BB%B6%EF%BC%9F.png)
如果我有一个很大的 zip 文件并在其中添加一个文件,Windows 会创建该文件的副本然后删除原始文件,从而导致非常大的“写入放大”,还是只会添加到文件中?
(也许它是 SSD 还是 HDD 很重要?)
答案1
虽然 Zip 文件格式 被定义为允许快速附加而无需重新复制整个档案,我不知道有哪个 Zip/7Zip 程序可以做到这一点。
Zip 档案包含一个内部目录,允许直接访问其中的任何项目。该目录存储在档案末尾,包括目录在内的所有项目都由标题标识。
原则上,将新项目附加到档案中可以通过将其附加到档案文件,然后附加新目录来完成。但是,如果在将新目录完全写入并刷新到磁盘之前发生计算机故障,则可能导致档案末尾出现垃圾。
虽然理论上仍然可以通过从档案末尾扫描最后写入的目录的标题来恢复,但是只期望在文件末尾找到目录的程序将会失败,并宣布档案损坏。
我已测试将文件附加到两个 Zip 产品和 7Zip 的存档中,并在操作前后查询存档的磁盘地址。我使用了
fsutil file queryextents
命令。
这三款产品均未尝试优化附加操作。在附加新项目时,这三款产品均重新复制了整个档案。
我的结论是,虽然可能存在这样的优化产品,但最好测试一下你的产品是否是这样的。如果不进行测试,默认假设存档将被重新复制。