zoukankan      html  css  js  c++  java
  • 【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压缩库使用


  • 相关阅读:
    73. Set Matrix Zeroes
    289. Game of Live
    212. Word Search II
    79. Word Search
    142. Linked List Cycle II
    141. Linked List Cycle
    287. Find the Duplicate Number
    260. Single Number III
    137. Single Number II
    Oracle EBS中有关Form的触发器的执行顺序
  • 原文地址:https://www.cnblogs.com/linuxAndMcu/p/14508503.html
Copyright © 2011-2022 走看看