正在写的这个工程中有个需求,是对所有经过处理的图片进行打包上传的工作,本来是想查找一下MFC中是否有这种打包压缩的类,但是没找到。后来想到使用WinRAR,使用命令行来对某些文件进行压缩,但后来一想“人家用户万一就是不装WinRAR怎么办”,于是只能依靠第三方库了

又是一个老外写的,猛击这儿: 是用C写的,没有调用其他的库,还是比较干净的。

使用方法在里面的readme.txt中就有,其实无非就是zip和unzip。

若要压缩文件,则使用以下几行代码即可轻易搞定:

  1. #include "zip.h" 
  2.  
  3. HZIP hz = CreateZip("c:\\simple1.zip",0); 
  4. ZipAdd(hz,"znsimple.bmp""c:\\simple.bmp"); 
  5. ZipAdd(hz,"znsimple.txt""c:\\simple.txt"); 
  6. CloseZip(hz); 

CreateZip是创建的压缩文件的路径,后面的参数是指的解压缩密码,如果没有的话,则填0。

ZipAdd便开始向压缩包中添加文件了。第一个参数是HZIP类的对象,第二个参数是添加到压缩包里的文件的名字,第三个参数是要被压缩的文件的路径。

最后记得CloseZip(),一个叫simple1.zip的压缩包便成生在C盘下了。

我测试了一下,四张图片,一共492K,压缩完后是465K,没有压缩多少。一个TXT,945K,压缩完后461K。

然后用WinRAR测试了一下,数字基本是一样的=。= 看来此公所写的算法应该跟WinRAR的算法类似。

若要解压缩文件,则要这么写:

  1. #include "unzip.h" 
  2.  
  3. HZIP hz = OpenZip("c:\\stuff.zip",0); 
  4. ZIPENTRY ze;  
  5. GetZipItem(hz,-1,&ze);  
  6. int numitems = ze.index; 
  7. for (int i=0; i<numitems; i++) 
  8. {  
  9.     GetZipItem(hz,i,&ze); 
  10.     UnzipItem(hz,i,ze.name); 
  11. CloseZip(hz); 

OpenZip与CreateZip类似,后面的0是解压缩密码。

ZIPENTRY是个结构体,如下:

  1. typedef struct 
  2. int index;                 // index of this file within the zip 
  3.   TCHAR name[MAX_PATH];      // filename within the zip 
  4.   DWORD attr;                // attributes, as in GetFileAttributes. 
  5.   FILETIME atime,ctime,mtime;// access, create, modify filetimes 
  6.   long comp_size;            // sizes of item, compressed and uncompressed. These 
  7.   long unc_size;             // may be -1 if not yet known (e.g. being streamed in) 
  8. } ZIPENTRY; 

GetZipItem是要获取包中的文件,但是需要注意一下,如果第二个参数为-1的话,表示获得整个包的信息,并存储在ZIPENTRY结构体中。

总得来说,这个库的使用方法很简单,只要将四个文件拷贝入工程目录下,并且添加进工程中,编译一下就能使用啦!

PS:我在使用的时候遇到预编译的问题,只需要在zip.cpp和unzip.cpp的#include <windows.h>的前面加入#include "stdafx.h" 就可以喽。注意,一定是前面。

  1. #include "stdafx.h" 
  2. #include <windows.h> 
  3. #include <stdio.h> 
  4. #include <tchar.h> 
  5. #include "zip.h"