zlib的安装可以参照http://blog.sina.com.cn/s/blog_6e0693f70100sjgj.html这篇文章的做。我用的是1.28版本的也是可以的。
要注意的是6个项目,主要就是最下面两个就可以了,一个是静态库,一个是动态库。如果要编译其它4个的话要在项目属性
连接器的输入添加刚才生成的zlibwapid.lib或zlibwapi.lib取决于是debuge还是release版本
zlib主要是compress和uncompress就可以实现压缩和解压缩了。但这只是标准的字符串的压缩,不是文件的压缩也不是文件的压缩。好在zlib库带了minizip用来压缩文件成标准的zip文件,这样压缩的文件就可以用rar等常用的解压缩工具打开了。将下载的源代码下minizip文件夹文件除minizip.c引用到项目中。
主要是用zipOpen64,zipOpenNewFileInZip,zipWriteInFileInZip,zipCloseFileInZip,zipClose
ZipComress(const char * Directory,const char * DestPath,int type,int mode )
{
try
{
GetAllFiles(Directory,type);
if(FileName.size() == 0)
{
return ZIP_RETURN_FILE_NOT_FOUND;
}
char * buf = new(nothrow) char[BUF_LEN];
if(buf == NULL)
{
abort();
FileName.swap(vector()); //清空vector的内存
return ZIP_RETURN_ERROR;
}
zipFile zf = NULL;
zf = zipOpen64(DestPath,mode);
zip_fileinfo FileInfo;
ZeroMemory(&FileInfo,sizeof(FileInfo));
int ret;
for (vector::size_type i = 0; i < FileName.size(); i ++)
{
zipOpenNewFileInZip(zf,FileName.at(i).c_str(),&FileInfo,NULL,0,NULL,0,NULL,Z_DEFLATED,9);
ifstream infile(FileName.at(i),ios::binary);
if(!infile.good())
{
zipCloseFileInZip(zf);
zipClose(zf,NULL);
remove(DestPath);
FileName.swap(vector());
return ZIP_RETURN_FILE_IO_ERROR;
}
do
{
infile.read(buf,BUF_LEN);
uLong readlen = infile.gcount();
ret = zipWriteInFileInZip(zf,buf,readlen);
if(ret != ZIP_OK )
{
zipCloseFileInZip(zf);
zipClose(zf,NULL);
remove(DestPath);
FileName.swap(vector());
return ZIP_RETURN_FILE_IO_ERROR;
}
Sleep(80); //使cpu的使用率降低
} while (!infile.eof());
zipCloseFileInZip(zf);
}
delete [] buf;
zipClose(zf,NULL);
FileName.swap(vector());
}
catch(...)
{
FileName.swap(vector());
return ZIP_RETURN_ERROR;
}
return ZIP_RETURN_OK;
}
GetAllFiles(Directory,type);也是自己写的是压缩整个文件夹或文件判断是否是文件或文件
GetAllFiles(const char * Directory,int type)
{
long hFile = 0;
_finddata_t fileinfo;
string p;
if((hFile = _findfirst(p.assign(Directory).append("\\*").c_str(),&fileinfo)) != -1)
{
do
{
//如果是目录则递归
//如果不是则加入vector
if(fileinfo.attrib & _A_SUBDIR)
{
if(strcmp(fileinfo.name,".") != 0 && strcmp(fileinfo.name,"..") != 0)
GetAllFiles(p.assign(Directory).append("\\").append(fileinfo.name).c_str(),type);
}
else
{
FileName.push_back(p.assign(Directory).append("\\").append(fileinfo.name));
}
}
} while (_findnext(hFile,&fileinfo) == 0);
_findclose(hFile);
}
else
FileName.push_back(Directory); //是文件直接加入
}
FileName是一个vector就可以了
这样生成的文件或问价夹就可以直接用rar来解压缩了。如果项目用不到的话可以不用写解压缩的方法,可以直接用工具。如果要的话思路是一样的,或者直接用rar.exe.具体自己看吧应该不是太难。