ZIP文件格式。如何正确读取文件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZIP文件格式。如何正确读取文件?相关的知识,希望对你有一定的参考价值。

我目前正在开发一个Node.js项目。我希望能够读取,修改和编写ZIP文件而不将其保存到FS中(我们通过TCP接收它并在修改后将其发回),到目前为止看起来可能是简单的ZIP文件结构。目前我指的是this documentation

所以ZIP文件结构简单:

File header 1
File data 1
File data descriptor 1

File header 2
File data 2
File data descriptor 2

...

[other not important yet]

首先,我们需要读取文件头,其中包含字段compressed size,它可能是读取file data 1长度的完美方式。但事实并非如此。该字段可能包含'0'或'0xFFFFFFFF',这些值不描述其实际长度。在这种情况下,我们必须读取文件数据而不知道它的长度信息。但是怎么样?

压缩/解压缩算法描述对我来说看起来相当复杂,我打算无论如何都要使用ZLIB进行压缩。所以如果那里描述了有用的东西,那么我就错过了这一点。

有人能解释一下阅读这些文件的正确方法吗?

附:请避免建议使用npm模块。我不想只解决问题,还要了解事情是如何运作的。

答案

注意 - 我假设您想要读取和处理zip文件,因为它来自套接字,而不是在处理之前将完整的zip文件读入内存。这两个选项都有效。

我最初忽略了compressed size的值为'0'或'0xFFFFFFFF'的用例。前者仅存在于以流模式创建的zip文件中,后者适用于大于4Gig的zip文件。

处理它们会增加很多复杂性 - 如有必要,您可以在以后添加对它们的支持。是否需要支持0 / 0xFFFFFFFF用例取决于您要处理的zip文件的性质。

compression methoddeflated(8)时,使用zlib进行压缩/减压。你还需要支持compression method stored(0)。它用于压缩不合适的非常小的文件。

以上是关于ZIP文件格式。如何正确读取文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确读取定宽格式文件

如何正确关闭嵌套的 ZipInputStreams?

熊猫。如何从 ZIP 存档中读取 Excel 文件

怎样用Java生成ZIP文件

java 如何读取本地硬盘上面的zip文件. 返回ZipInputStream流!

如何读取多个 zip 文件中的所有 csv 文件?