Unzip解压zip压缩包

4 篇文章 0 订阅

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 所以我很不解上面的问题。

可以用到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); }

以上是我这次解压过程的疑难解决,也是作为自己的笔记与大家共享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值