C++-C++中如何实现zip解压和压缩缩目录?
使用zlib将文件夹压缩成zip文件时,需要自己读取文件然后写入zip文件,
如何在程序中实现压缩和解压缩整个目录的功能。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
使用zlib将文件夹压缩成zip文件时,需要自己读取文件然后写入zip文件,
如何在程序中实现压缩和解压缩整个目录的功能。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(1)
今天要实现协议解析,同时要解压错zip文件,而且zip是针对目录压缩的,所以要解压缩到特定目录中,自己把这个问题已经解决了。
在codeproject找到一个事例,用后自己有重新封装了下,封装成一个函数。
[http://www.codeproject.com/KB/files/zip_utils.aspx][1]
#include <atlconv.h> //for W2CA
#include "zlib/contrib/minizip/zip.h"
//最终接口:从某个目录创建zip文件
void CreateZipFromDir(const CString& dirName, const CString& zipFileName);
//将文件添加到zip文件中,注意如果源文件srcFile为空则添加空目录
//fileNameInZip: 在zip文件中的文件名,包含相对路径
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[MAX_PATH];
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)
{
MessageBox(_T("无法添加文件") + CString(srcFile) + _T("!"));
zipCloseFileInZip(zf); //关闭zip文件
return;
}
//读入源文件并写入zip文件
char buf[100*1024]; //buffer
int numBytes = 0;
while( !feof(srcfp) )
{
numBytes = fread(buf, 1, sizeof(buf), srcfp);
zipWriteInFileInZip(zf, buf, numBytes);
if( ferror(srcfp) )
break;
}
//关闭源文件
fclose(srcfp);
}
//关闭zip文件
zipCloseFileInZip(zf);
}
//递归添加子目录到zip文件
void CollectFilesInDirToZip(zipFile zf, const CString& strPath, const CString& parentDir)
{
USES_CONVERSION; //for W2CA
CString strRelativePath;
CFileFind finder;
BOOL bWorking = finder.FindFile(strPath + _T("//*.*"));
while(bWorking)
{
bWorking = finder.FindNextFile();
if(finder.IsDots())
continue;
if (parentDir == _T(""))
strRelativePath = finder.GetFileName();
else
strRelativePath = parentDir + _T("//") + finder.GetFileName(); //生成在zip文件中的相对路径
if(finder.IsDirectory())
{
AddFileToZip(zf, W2CA(strRelativePath), NULL); //在zip文件中生成目录结构
CollectFilesInDirToZip(zf, finder.GetFilePath(), strRelativePath); //递归收集子目录文件
continue;
}
AddFileToZip(zf, W2CA(strRelativePath), W2CA(finder.GetFilePath())); //将文件添加到zip文件中
}
}
//最终接口:从某个目录创建zip文件
void CreateZipFromDir(const CString& dirName, const CString& zipFileName)
{
USES_CONVERSION; //使用W2CA转换unicode字符集
zipFile newZipFile = zipOpen(W2CA(zipFileName), APPEND_STATUS_CREATE); //创建zip文件
if (newZipFile == NULL)
{
MessageBox(_T("无法创建zip文件!"));
return;
}
CollectFilesInDirToZip(newZipFile, dirName, _T(""));
zipClose(newZipFile, NULL); //关闭zip文件
}