12

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

这是我到目前为止所做的:

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");

我总是收到“解压缩数据错误”,我不知道为什么。然后我想知道如何在我的数据未压缩的情况下检索这两个文件。

4

3 回答 3

20

zip 是一种文件格式,它围绕压缩数据流包装标题和尾部信息,以表示一组文件和目录。压缩后的数据流几乎都是deflate 数据流,实际上可以通过 zlib 生成和解码。zlib 还提供了crc32可用于生成和检查 zip 包装信息中的 crc 值的功能。

zlib 本身不做的是解码和解构 zip 结构。您可以使用规范编写自己的代码来执行此操作(不是很难做到),或者您可以使用zlib 发行版的contrib/minizip 目录中的 minizip 例程,它提供了打开、访问和关闭 zip 的功能文件。

于 2012-07-23T23:29:40.607 回答
10

Zlib 不是用于处理 .zip 文件的库。它支持解压缩 zlib 和 gzip 流,两者都在单个数据流的级别上工作,而不是像 .zip 这样的“存档”格式。

您将需要一个不同的库(例如libzip;还有许多其他库)来打开和操作 .zip 档案。

于 2012-07-23T12:20:56.157 回答
3

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

如果您想创建 zip 或解压缩文件,您必须处理 zip 格式,而 minizip 是一个不错的库,功能强大并且已经存在了很长时间。

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

此外,我最终构建了一个包含 minizip 的库,并为其添加了许多不错的功能,使其更易于使用且更面向对象。让您可以执行压缩整个文件夹、流、向量等操作,以及完全在内存中完成所有操作。

回购与示例在这里:https ://github.com/sebastiandev/zipper

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

代码看起来像:

Zipper zipper("ziptest.zip");
zipper.add("somefile.txt");
zipper.add("myFolder");
zipper.close();
于 2015-07-26T18:49:58.073 回答