2012-07-23 96 views
5

我有一个archive.zip,其中包含两个加密的“.txt”文件。我想解压档案,以检索这2个文件。使用zlib解压zip文件

这是我到目前为止已经完成:

FILE *FileIn = fopen("./archive.zip", "rb"); 
if (FileIn) 
    printf("file opened\n"); 
else 
    printf("unable to open file\n"); 

fseek(FileIn, 0, SEEK_END); 
unsigned long FileInSize = ftell(FileIn); 
printf("size of input compressed file : %u\n", FileInSize); 

void *CompDataBuff = malloc(FileInSize); 
void *UnCompDataBuff = NULL; 

int fd = open ("archive.zip", O_RDONLY); 
CompDataBuff = mmap(NULL, FileInSize, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); 
printf("buffer read : %s\n", (char *)CompDataBuff); 

uLongf UnCompSize = (FileInSize * 11/10 + 12); 
UnCompDataBuff = malloc(UnCompSize); 

int ret_uncp ; 

ret_uncp = uncompress((Bytef*)UnCompDataBuff, &UnCompSize, (const Bytef*)CompDataBuff,FileInSize); 
printf("size of uncompressed data : %u\n", UnCompSize); 

if (ret_uncp == Z_OK){ 
    printf("uncompression ok\n"); 
    printf("uncompressed data : %s\n",(char *)UnCompDataBuff); 
    } 
if (ret_uncp == Z_MEM_ERROR) 
    printf("uncompression memory error\n"); 
if (ret_uncp == Z_BUF_ERROR) 
    printf("uncompression buffer error\n"); 
if (ret_uncp == Z_DATA_ERROR) 
    printf("uncompression data error\n"); 

我总是得到“非压缩数据错误”,我不知道为什么。然后我想知道如何检索2个文件与我的数据未压缩。

回答

4

Zlib不是处理.zip文件的库。它支持解压缩zlib和gzip流,这两种流都可以在单一数据流的层面上工作,而不是象.zip这样的“归档”格式。

您需要一个不同的库(例如,libzip;还有许多其他库)来打开和处理.zip压缩文件。

+0

哦,真的,我肯定会的zlib处理.zip文件..无论如何谢谢你的信息! :) – user1336204 2012-07-23 12:27:18

+0

zlib实际上可以帮助进行压缩处理,并且源代码发行版附带了处理zip文件的贡献代码。看到我的答案。 – 2012-07-23 23:30:19

+1

哦,libzip使用zlib。 – 2012-07-24 02:26:05

12

zip是一种文件格式,它将压缩数据流中的标题和尾部信息包装起来以表示一组文件和目录。压缩的数据流几乎总是为deflate data streams,实际上它可以由zlib生成和解码。 zlib还提供了crc32函数,该函数可用于生成并检查zip封装器信息中的crc值。

zlib本身没有做的是解码和解构zip结构。您可以使用specification(不是很难)编写自己的代码,也可以使用zlib distributioncontrib/minizip directory中的minizip例程,该函数提供打开,访问和关闭zip文件的函数。

+0

谢谢。我添加了contrib/minizip头文件,并能够从zip文件中读取文件(在已经使用zlib的应用程序中)。我只需编写一些简单的函数来将调用包装到unzip.h中的接口中 – 2016-07-15 20:51:53

2

如前所述,zlib只处理压缩​​,它不存档。当你想压缩或解压缩你正在做的是从档案中提取文件,这恰好是一个zip格式(还有其他格式,如rar,7zip等)

如果你想创建zip或解压缩你必须处理zip格式的文件和minizip是一个不错的库,强大,并已在那里很长一段时间。

有一个关于如何使用它的例子的minizip https://github.com/nmoinvaz/minizip的贡献。这并不难,你可以查看minizip.c和miniunz.c以获得如何使用它的代码。 (Minizip使用zlib进行压缩)

此外,我最终构建了一个包装minizip的库,并为其添加了一些不错的功能,使其更易于使用和更面向对象。让你做一些事情,如zip整个文件夹,流,矢量等。以及完全在内存中做所有事情。

回购与这里的例子:https://github.com/sebastiandev/zipper

预测试版本:https://github.com/sebastiandev/zipper/releases/

代码看起来是这样的:

Zipper zipper("ziptest.zip"); 
zipper.add("somefile.txt"); 
zipper.add("myFolder"); 
zipper.close();