Unzip解压zip压缩包
ZLib库
工作中遇到需要从原来解压rar(用的unrar库)改成解压zip的需求,刚开始度娘了网上有zlib库,所以尝试用该库开发,网上有很多一个很火的case,但是到了
//读取文件
const int BUFFER_SIZE = 4096;
char szReadBuffer[BUFFER_SIZE];
while(TRUE)
{
memset(szReadBuffer, 0, BUFFER_SIZE);
int nReadFileSize = unzReadCurrentFile(unzfile, szReadBuffer, BUFFER_SIZE);
```
}
这里的BUFFER_SIZE 设置4096就会到unzReadCurrentFile出现内存越界,违法访问的问题,当我改成256以下才可以调用这个函数,所以导致解压速度特别慢。所以放弃,也希望有大牛有解决方法的话帮忙提供。如图:
于是,我又度娘了一份05年的老开源代码XUnzip
XUnzip库
以下是一个很简单的例子,每个api接口我在这不详解了,度娘上查得到。虽然这个库其实源代码还是调用上面的zlib库的代码,而且也用到了unzReadCurrentFile这个api并且buffer设置了16384 所以我很不解上面的问题。
TCHAR* strSrc = _T("temp1.zip");
//TCHAR* strDes = _T("C:\\Users\\watching_wang\\Desktop\\VAssistSupport2017\\");
HZIP hZip;
hZip = OpenZip(strSrc,0,ZIP_FILENAME);
if(0 == hZip)
{
_tprintf(_T("Invalid Handle"));
return EXIT_FAILURE;
}
string strCurFileName;
ZIPENTRY zipEntry;
GetZipItem(hZip,-1,&zipEntry);
int numitems = zipEntry.index;
for (int zi = 0; zi < numitems; zi++)
{
GetZipItem(hZip, zi, &zipEntry);
strCurFileName = zipEntry.name;
char unZipFileName[260] = {0};
strcpy(unZipFileName,strCurFileName.c_str());
printf("%s\n",unZipFileName);
UnzipItem(hZip,zi,unZipFileName,0,ZIP_FILENAME);
}
CloseZip(hZip);
这个库有几个问题,在这我列出来并提供解决方案(并不是唯一):
- 不能设置解压目的地路径,可以用SetCurrentDirectory(path); 修改进程的默认路径,这样解压出来的内容直接默认到这个路径当中
- 解压出来的内容为只读文件,修改源代码,改成你想设置的文件属性。
ZRESULT TUnzip::Unzip(int index,void *dst,unsigned int len,DWORD flags) 创建文件之前。 if(ze.attr & FILE_ATTRIBUTE_READONLY) { ze.attr -= FILE_ATTRIBUTE_READONLY; SetFileAttributes((const TCHAR*)dst, ze.attr); }
以上是我这次解压过程的疑难解决,也是作为自己的笔记与大家共享。