Zlib 解压excel压缩包内存报错!

l357630798 2018-03-01 06:28:55
有哪位大神弄过使用 Zlib 解压&压缩文件及文件夹过?求指导。
我使用 Zlib 解压 excel 压缩包, Zlib库函数 unzReadCurrentFile 会内存报错。解压.txt格式的压缩包则没有问题。

解压部分源代码如下,求高手帮忙指点下:

ZIP_ERR CZipHelperImpl::Uncompress(const char* pSrcFile, const char* pDestPath)
{
unzFile unzfile = NULL;
ZIP_ERR errCode = ZIP_OK;
try
{
unzfile = unzOpen64(pSrcFile);
if (NULL == unzfile)
{
throw ZIP_OPEN_SRC_FILE_FAIL;
}

unz_global_info64* pstGlobalInfo = new unz_global_info64;
unz_file_info64* pstFileInfo = new unz_file_info64;

auto ReleaseResource = [&pstGlobalInfo, &pstFileInfo, &unzfile]() -> void
{
delete pstGlobalInfo;
delete pstFileInfo;
unzClose(unzfile);
};

try
{
if(UNZ_OK != unzGetGlobalInfo64(unzfile, pstGlobalInfo))
{
throw ZIP_GET_ZIP_GLOBAL_INFO_FAIL;
}

char szZipFileName[256] = {'\0'};
for (uLong count = 0; count < pstGlobalInfo->number_entry; count++)
{
if(UNZ_OK != unzGetCurrentFileInfo64(unzfile, pstFileInfo, szZipFileName, 256, NULL, 0, NULL, 0))
{
throw ZIP_GET_ZIP_CUR_FILE_INFO_FAIL;
}
std::string archive = std::string(pDestPath) + "\\" + std::string(szZipFileName);
switch (pstFileInfo->external_fa)//external file attributes
{
case FILE_ATTRIBUTE_DIRECTORY:
{
CreateDirectory(archive.c_str(), NULL);
}
break;
default:
{
if(UNZ_OK != unzOpenCurrentFile(unzfile))
{
throw ZIP_OPEN_ZIP_CUR_FILE_FAIL;
}
__Unzip2File(unzfile, archive.c_str());
if(UNZ_OK != unzCloseCurrentFile(unzfile))
{
throw ZIP_CLOSE_ZIP_CUR_FILE_FAIL;
}
}
}
unzGoToNextFile(unzfile);
}
ReleaseResource();
}
catch(const ZIP_ERR& err)
{
ReleaseResource();
errCode = err;
}
}
catch(const ZIP_ERR& err)
{
errCode = err;
}
return errCode;
}



void CZipHelperImpl::__Unzip2File(unzFile unzfile, const char* file)
{
assert(NULL != unzfile);
HANDLE hFile = ::CreateFile(
file, //file name
GENERIC_WRITE, //access mode
0, //share mode
NULL, //SD
OPEN_ALWAYS, //how to create
FILE_FLAG_WRITE_THROUGH, //file attributes
NULL //handle to template file
);
if (INVALID_HANDLE_VALUE == hFile)
{
throw ZIP_CREATE_UNZIP_FILE_FAIL;
}

try
{
std::string buf(BUFLEN, '\0');
int len = 0;
while(true)
{
buf.clear();
buf.resize(BUFLEN, '\0');
len = unzReadCurrentFile(unzfile, const_cast<char*>(buf.c_str()), BUFLEN);
if(0 > len)
{
throw ZIP_READ_ZIP_FILE_FAIL;
}
else if (0 == len)
{
break;
}
else
{
DWORD dwNumOfWrite = 0;
if(!::WriteFile(hFile, (LPCVOID)buf.c_str(), len, &dwNumOfWrite, NULL))
{
throw ZIP_WRITE_UNZIP_FILE_FAIL;
}
}
}
::CloseHandle(hFile);
}
catch(const ZIP_ERR& err)
{
::CloseHandle(hFile);
throw err;
}
}


报错:

...全文
966 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
羽化大刀 2018-03-31
  • 打赏
  • 举报
回复
我曾经出现过类似的问题。 原因就是,压缩使用的是高版本的压缩算法,而解压时,使用zlib版本较低,你尝试升级一下zlib。
赵4老师 2018-03-02
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
oyljerry 2018-03-02
  • 打赏
  • 举报
回复
用二进制方式读写文件,excel不能用字符串方式处理
zgl7903 2018-03-01
  • 打赏
  • 举报
回复
个人猜测 TXT 正常, 而EXCEL不正常, 是否是按ASC码模式处理的? 试试 binary 方式打开/写入 奔溃 点击重试 结合调用堆栈修改解决之

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧