我根据规范读取 zip 文件,并从中央目录获取每个文件的信息。从我读到的标题:
#define VERSION_NEEDED_OFSSET 6
UINT16 versionNeeded = (UINT16)*(zipFile + VERSION_NEEDED_OFSSET);
Run Code Online (Sandbox Code Playgroud)
所以我压缩了一些文件,还有一些目录,当我得到关于目录的信息时,我得到了 versionNeeded = 0x000a
从我阅读的文档中:
提取文件所需的最低支持 ZIP 规范版本,映射如上。该值基于 ZIP 程序必须支持的特定格式功能才能提取文件。如果多个功能应用于一个文件,则必须将最低版本设置为具有最高值的功能。将使用比上次发布的值更高的版本号来实现影响已发布格式规范的新功能或功能更改,以避免冲突。
4.4.3.2 当前最低功能版本定义如下:
1.0 - 默认值
1.1 - 文件是卷标
2.0 - 文件是一个文件夹(目录)
但是用于确定文件类型的 zip 标头部分是什么?我看不到文档中负责文件类型的任何类型或位。
好的。如果有人发现这个,正确的方法是检查中央目录开始处的偏移量加上38 ,这是一个称为外部文件属性的字段
从文档中:
4.4.15 外部文件属性:(4 字节)外部属性的映射取决于主机系统(参见“版本由”)。对于 MS-DOS,低位字节是 MS-DOS 目录属性字节。如果输入来自标准输入,则该字段设置为零。
UINT32 external_attributes = (UINT32)*(zipFile + 38);
Run Code Online (Sandbox Code Playgroud)
然后将此值与MSDN 中的常量进行匹配。
要匹配目录,请external_attributes像这样进行比较:
if(external_attributes == 0x10) //FILE_ATTRIBUTE_DIRECTORY
Run Code Online (Sandbox Code Playgroud)