正在写的这个工程中有个需求,是对所有经过处理的图片进行打包上传的工作,本来是想查找一下MFC中是否有这种打包压缩的类,但是没找到。后来想到使用WinRAR,使用命令行来对某些文件进行压缩,但后来一想“人家用户万一就是不装WinRAR怎么办”,于是只能依靠第三方库了
又是一个老外写的,猛击这儿: 是用C写的,没有调用其他的库,还是比较干净的。
使用方法在里面的readme.txt中就有,其实无非就是zip和unzip。
若要压缩文件,则使用以下几行代码即可轻易搞定:
- #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);
CreateZip是创建的压缩文件的路径,后面的参数是指的解压缩密码,如果没有的话,则填0。
ZipAdd便开始向压缩包中添加文件了。第一个参数是HZIP类的对象,第二个参数是添加到压缩包里的文件的名字,第三个参数是要被压缩的文件的路径。
最后记得CloseZip(),一个叫simple1.zip的压缩包便成生在C盘下了。
我测试了一下,四张图片,一共492K,压缩完后是465K,没有压缩多少。一个TXT,945K,压缩完后461K。
然后用WinRAR测试了一下,数字基本是一样的=。= 看来此公所写的算法应该跟WinRAR的算法类似。
若要解压缩文件,则要这么写:
- #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);
OpenZip与CreateZip类似,后面的0是解压缩密码。
ZIPENTRY是个结构体,如下:
- typedef struct
- { int index; // index of this file within the zip
- TCHAR name[MAX_PATH]; // filename within the zip
- DWORD attr; // attributes, as in GetFileAttributes.
- FILETIME atime,ctime,mtime;// access, create, modify filetimes
- long comp_size; // sizes of item, compressed and uncompressed. These
- long unc_size; // may be -1 if not yet known (e.g. being streamed in)
- } ZIPENTRY;
GetZipItem是要获取包中的文件,但是需要注意一下,如果第二个参数为-1的话,表示获得整个包的信息,并存储在ZIPENTRY结构体中。
总得来说,这个库的使用方法很简单,只要将四个文件拷贝入工程目录下,并且添加进工程中,编译一下就能使用啦!
PS:我在使用的时候遇到预编译的问题,只需要在zip.cpp和unzip.cpp的#include <windows.h>的前面加入#include "stdafx.h" 就可以喽。注意,一定是前面。
- #include "stdafx.h"
- #include <windows.h>
- #include <stdio.h>
- #include <tchar.h>
- #include "zip.h"