使用Zlib库进行文件的压缩和解压
zlib介紹
zlib是提供數據壓縮用的函式庫,由Jean-loup Gailly與Mark Adler所開發,初版0.9版在1995年5月1日發表。zlib使用DEFLATE算法,最初是為libpng函式庫所寫的,后來普遍為許多軟件所使 用。此函式庫為自由軟件,使用zlib授權
配置
我是從網上直接下載了zlib的dll文件的,壓縮包具體有幾個部分,分別是頭文件zconf.h,zlib.h;lib文件 zdll.lib;dll文件zlib1.dll。配置過程很簡單,包含頭文件目錄或引入頭文件;配置VS的工程屬性頁,在鏈接器-常規-附加庫目錄,添 加lib文件所在目錄,同時在鏈接器-輸入-附加依賴項,添加zdll.lib;最后將zlib1.dll放到Debug目錄和exe文件在一起就可以 了。
例子
#include <stdio.h>
#include "zlib.h"
int main()
{
/* 原始數據 */
unsigned char strSrc[] = "hello world! aaaaa bbbbb ccccc ddddd 中文測試 yes";
unsigned char buf[1024] = {0};
unsigned char strDst[1024] = {0};
unsigned long srcLen = sizeof(strSrc);
unsigned long bufLen = sizeof(buf);
unsigned long dstLen = sizeof(strDst);
printf("Src string:%s
Length:%ld
", strSrc, srcLen);
/* 壓縮 */
compress(buf, &bufLen, strSrc, srcLen);
printf("After Compressed Length:%ld
", bufLen);
/* 解壓縮 */
uncompress(strDst, &dstLen, buf, bufLen);
printf("After UnCompressed Length:%ld
",dstLen);
printf("UnCompressed String:%s
",strDst);
return 0;
}
輸出結果是:
Src string:hello world! aaaaa bbbbb ccccc ddddd 中文測試 yes Length:50 After Compressed Length:49 After UnCompressed Length:50 UnCompressed String:hello world! aaaaa bbbbb ccccc ddddd 中文測試 yes
這里,zlib只是把一段內存壓縮,壓縮后放的另一段內存上,這離壓縮文件甚至文件夾的目標還很遠。確切的說,zlib可能并不是一個針對 ZIP文件的庫,它只是一個針對gzip以及deflate算法的庫。它提供了一個叫做minizip (contribminizip) 例子來給出操作 ZIP 文件的方法。
Minizip
Minizip是一個Zip和UnZip文件的附加實例。minizip.c和miniunz.c分別實際的壓縮、解壓程序,除去其主程序minizip.c和miniunz.c后,剩下的部分我們可以看作是zlib的一個上層庫,它封裝了與ZIP文件格式相關的操作。
壓縮的具體操作
壓縮涉及到以下api:
zipOpen64
zipClose
zipOpenNewFileInZip
zipCloseFileInZip
zipWriteInFileInZip
使用 zipOpen64 來打開/創建一個 ZIP 文件,然后開始遍歷要被放到壓縮包中去的文件。針對每個文件,先調用一次 zipOpenNewFileInZip,然后開始讀原始文件數據,使用 zipWriteInFileInZip 來寫入到 ZIP 文件中去。zipOpenNewFileInZip 的第三個參數是一個 zip_fileinfo 結構,該結構數據可全部置零,其中 dosDate 可用于填入一個時間(LastModificationTime)。它的第二個參數是 ZIP 中的文件名,若要保持目錄結構,該參數中可以保留路徑。
解壓的具體操作
解壓縮涉及到以下api:
unzOpen64
unzClose
unzGetGlobalInfo64
unzGoToNextFile
unzGetCurrentFileInfo64
unzOpenCurrentFile
unzCloseCurrentFile
unzReadCurrentFile
打開一個 ZIP 文件后,需要先使用 unzGetGlobalInfo64 來取得該文件的一些信息,來了解這個壓縮包里一共包含了多少個文件,等等。目前我們用得著的就是這個文件數目。然后開始遍歷 ZIP 中的文件,初始時自動會定位在第一個文件,以后處理完一個后用 unzGoToNextFile 來跳到下一個文件。對于每個內部文件,可用 unzGetCurrentFileInfo64 來查內部文件名。這個文件名和剛才 zipOpenNewFileInZip 的第二個參數是一樣的形式,所以有可能包含路徑。也有可能會以路徑分隔符(/)結尾,表明這是個目錄項(其實壓縮操作的時候也可以針對目錄寫入這樣的內部 文件,上面沒有做)。所以接下來要根據情況創建(多級)目錄。unzGetCurrentFileInfo64 的第三個參數是 unz_file_info64 結構,其中也有一項包含了 dosDate 信息,可以還原文件時間。對于非目錄的內部文件,用 unzOpenCurrentFile,打開,然后 unzReadCurrentFile 讀取文件內容,寫入到真實文件中。unzReadCurrentFile 返回 0 表示文件讀取結束。
本文來自:Linux學習網
總結
以上是生活随笔為你收集整理的使用Zlib库进行文件的压缩和解压的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何设置路由器实现跨网段文件共享两个路由
- 下一篇: 如何设置小米路由器的智能限速如何设置小米