【C++ 壓縮&解壓縮 開源庫】ZIP入門使用總結


一、ZIP下載

ZIP 主要是用於簡單的壓縮和解壓,引入比較方便,而且極其易使用,方便用戶操作,下載下來就四個文件:zip.h、zip.cpp、unzip.h、unzip.cpp。

下載地址:http://www.codeproject.com/Articles/7530/Zip-Utils-clean-elegant-simple-C-Win


二、示例

使用的時候直接 include 就行了。下面是一些示例:

/*For unzipping, add "unzip.cpp" to your project. Then, for example*/
#include "unzip.h"
//
HZIP hz = OpenZip("c:\\stuff.zip",0);
ZIPENTRY ze; GetZipItem(hz,-1,&ze); int numitems=ze.index;
for (int i=0; i<numitems; i++)
{ GetZipItem(hz,i,&ze);
 UnzipItem(hz,i,ze.name);
}
CloseZip(hz);
 
 
 
 
/*For zipping, add "zip.cpp" to your project. (You can add just one of
zip/unzip, or both; they function independently and also co-exist.)*/
#include "zip.h"
//
HZIP hz = CreateZip("c:\\simple1.zip",0);
ZipAdd(hz,"znsimple.bmp", "c:\\simple.bmp");
ZipAdd(hz,"znsimple.txt", "c:\\simple.txt");
CloseZip(hz);

添加壓縮的封裝函數:

void AddFileToZip(zipFile zf, const char* fileNameInZip, const char* srcFile)
{
	FILE* srcfp = NULL;
 
	// 初始化寫入zip的文件信息
	zip_fileinfo zi;
	zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour =
	zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;
	zi.dosDate = 0;
	zi.internal_fa = 0;
	zi.external_fa = 0;
 
	// 如果srcFile為空,加入空目錄
	char new_file_name[WRITEBUFFERSIZE];
	memset(new_file_name, 0, sizeof(new_file_name));
	strcat(new_file_name, fileNameInZip);
	if (srcFile == NULL)
	{
		strcat(new_file_name, "/");
	}
 
	// 在zip文件中創建新文件
	zipOpenNewFileInZip(zf, new_file_name, &zi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION);
	if (srcFile != NULL)
	{
		// 打開源文件
		srcfp = fopen(srcFile, "rb");
		if (srcfp == NULL)
		{
			zipCloseFileInZip(zf); //關閉zip文件
			return;
		}
 
		// 讀入源文件並寫入zip文件
		int size_buf = 0;
		void* buf=NULL;
		size_buf = WRITEBUFFERSIZE;
		buf = (void*)malloc(size_buf);
 
		int numBytes = 0;
		while( !feof(srcfp) )
		{
			numBytes = fread(buf, 1, size_buf, srcfp);
			zipWriteInFileInZip(zf, buf, numBytes);
			if( ferror(srcfp) )
				break;
		}
 
		// 關閉源文件
		fclose(srcfp);
	}
 
	// 關閉zip文件
	zipCloseFileInZip(zf);
}

使用:

zipFile zf;
AddFileToZip(zf,"zip里的名字","需要壓縮的源文件");
zipClose(zf,0);

三、擴展:流行的一些C++壓縮&解壓庫

  • bzip2:一個完全免費,免費專利和高質量的數據壓縮。
  • doboz:能夠快速解壓縮的壓縮庫。
  • PhysicsFS:對各種歸檔提供抽象訪問的庫,主要用於視頻游戲,設計靈感部分來自於Quake3的文件子系統。
  • KArchive:用於創建,讀寫和操作文件檔案(例如zip和 tar)的庫,它通過QIODevice的一系列子類,使用gzip格式,提供了透明的壓縮和解壓縮的數據。
  • LZ4 :非常快速的壓縮算法。
  • LZHAM :無損壓縮數據庫,壓縮比率跟LZMA接近,但是解壓縮速度卻要快得多。
  • LZMA :7z格式默認和通用的壓縮方法。
  • LZMAT :及其快速的實時無損數據壓縮庫。
  • miniz:單一的C源文件,緊縮/膨脹壓縮庫,使用zlib兼容API,ZIP歸檔讀寫,PNG寫方式。
  • Minizip:Zlib最新bug修復,支持PKWARE磁盤跨越,AES加密和IO緩沖。
  • Snappy :快速壓縮和解壓縮。
  • ZLib :非常緊湊的數據流壓縮庫。
  • ZZIPlib:提供ZIP歸檔的讀權限。
  • QuaZIP:是使用 Qt/C++ 對 zlib 進行簡單封裝的用於壓縮及解壓縮 ZIP 的開源庫,適用於多種平台,資料也比較多,就是編譯稍麻煩些。

參考:

C++ ZIP壓縮文件,使用zlib庫和codeproject上的zip_utils

C++ zip壓縮庫使用



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM