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压缩库使用


  • 相关阅读:
    typora 页内跳转
    shell脚本搭建redis集群
    Html
    python json模块
    jenkins 问题合集
    day05 每日一行
    day04 每次一行
    day03 每日一行
    day02
    day02 每日一行
  • 原文地址:https://www.cnblogs.com/linuxAndMcu/p/14508503.html
Copyright © 2011-2022 走看看