当一段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;
}
}