解压内存文件

当一段buffer为zip压缩内容时,如何解压缩呢,这里直接贴上代码

bool UnZipMemFile(MemFile* memfile, const std::wstring& dest_folder, zip_progress_callback cb_func, void* pVoid)
{
    zlib_filefunc_def zip_funcs;
    std::string strPathAnsi;
    int nRetCode;

    __int64 total_size = 0;
    DWORD dwResBuffer = 0;

    zip_funcs.zopen_file = ZipOpenFunc;
    zip_funcs.zread_file = ZipReadFunc;
    zip_funcs.zwrite_file = ZipWriteFunc;
    zip_funcs.ztell_file = ZipTellFunc;
    zip_funcs.zseek_file = ZipSeekFunc;
    zip_funcs.zclose_file = ZipCloseFunc;
    zip_funcs.zerror_file = ZipErrorFunc;
    zip_funcs.opaque=NULL;
    void* hZip = unzOpen2((const char*)memfile, &zip_funcs);
    if (NULL == hZip)
        return false;

    bool retval = false;
    std::wstring dest_root = dest_folder;
    FormatWinPath(dest_root);

    wchar_t ch = dest_folder[dest_folder.size() - 1];
    if (ch != L'\\')
        dest_root += L'\\';

    __int64 curpos = 0;
    std::string read_buffer;
    std::wstring last_path = dest_root;
    CreateDirectoryRecur(last_path);

    nRetCode = unzGoToFirstFile(hZip);
    while (UNZ_OK == nRetCode)
    {
        char szCurrentFile[260];
        unz_file_info fileInfo;
        uLong dwSeekPos;
        uLong dwSize;

        nRetCode = unzGetCurrentFileInfo(
            hZip,
            &fileInfo,
            szCurrentFile,
            sizeof(szCurrentFile),
            NULL,
            0,
            NULL,
            0
            );
        if (nRetCode != UNZ_OK)
            goto clean0;

        dwSeekPos = unzGetOffset(hZip);
        dwSize = fileInfo.uncompressed_size;

        if (dwSize > 0)
        {
            std::wstring tmp_path;
            std::wstring filename = dest_root + AnsiToUnicode(szCurrentFile, -1);
            FormatWinPath(filename);

            for (int i = filename.size() - 1; i > 0; i--)
            {
                if (filename[i] == L'\\')
                {
                    tmp_path = filename.substr(0, i);
                    break;
                }
            }

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值