2012-07-23 73 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();