c++使用zlib和minizip压缩文件

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;
}

return 的各种标识是自己定义的枚举类型可以忽略,
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.具体自己看吧应该不是太难。

你可能感兴趣的:(C++)