C++ 壓縮解壓檔案
阿新 • • 發佈:2022-05-30
轉載來自:https://www.cnblogs.com/linuxAndMcu/p/14508503.html
一、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
一、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 的開源庫,適用於多種平臺,資料也比較多,就是編譯稍麻煩些。
參考: