基於Zlib實現的從ZIP檔案中提取檔案資料
阿新 • • 發佈:2019-01-10
[cpp]
view plaincopyprint?
- ZEXTRACT_API int GetFileInZip(CMemBuffer& buffer,constchar* zfn,constchar* fname,constchar* password)
- {
- unzFile uf = unzOpen(zfn);
- if (NULL == uf)
- {
- printf("unzOpen failed...\n");
- return -1;
- }
- int err = unzLocateFile(uf, fname, 0);
- if (UNZ_OK != err)
- {
- printf("GetFileInZip unzLocateFile failed... error:%d\n"
- return err;
- }
- unz_file_info file_info;
- char filename_inzip[256];
- err = unzGetCurrentFileInfo(uf, &file_info, filename_inzip,sizeof(filename_inzip), NULL, 0, NULL, 0);
- if (UNZ_OK != err)
- {
- printf("unzGetCurrentFileInfo failed... error:%d\n", err);
- return err;
- }
- err = unzOpenCurrentFilePassword(uf, password);
- if (UNZ_OK != err)
- {
- printf("unzOpenCurrentFilePassword failed... error:%d\n", err);
- return err;
- }
- char* pBuff = newchar[file_info.uncompressed_size];
- if (pBuff == NULL)
- {
- unzCloseCurrentFile(uf);
- unzClose(uf);
- return -2;
- }
- err = unzReadCurrentFile(uf, pBuff, file_info.uncompressed_size);
- if (err < 0)
- {
- printf("unzReadCurrentFile failed... error:%d\n", err);
- delete [] pBuff;
- unzCloseCurrentFile(uf);
- unzClose(uf);
- return err;
- }
- // Append data to the MemBuffer
- buffer.Append(pBuff, file_info.uncompressed_size);
- unzCloseCurrentFile(uf);
- unzClose(uf);
- return err;
- }
ZEXTRACT_API int GetFileInZip(CMemBuffer& buffer, const char* zfn, const char* fname, const char* password)
{
unzFile uf = unzOpen(zfn);
if (NULL == uf)
{
printf("unzOpen failed...\n");
return -1;
}
int err = unzLocateFile(uf, fname, 0);
if (UNZ_OK != err)
{
printf("GetFileInZip unzLocateFile failed... error:%d\n");
return err;
}
unz_file_info file_info;
char filename_inzip[256];
err = unzGetCurrentFileInfo(uf, &file_info, filename_inzip, sizeof(filename_inzip), NULL, 0, NULL, 0);
if (UNZ_OK != err)
{
printf("unzGetCurrentFileInfo failed... error:%d\n", err);
return err;
}
err = unzOpenCurrentFilePassword(uf, password);
if (UNZ_OK != err)
{
printf("unzOpenCurrentFilePassword failed... error:%d\n", err);
return err;
}
char* pBuff = new char[file_info.uncompressed_size];
if (pBuff == NULL)
{
unzCloseCurrentFile(uf);
unzClose(uf);
return -2;
}
err = unzReadCurrentFile(uf, pBuff, file_info.uncompressed_size);
if (err < 0)
{
printf("unzReadCurrentFile failed... error:%d\n", err);
delete [] pBuff;
unzCloseCurrentFile(uf);
unzClose(uf);
return err;
}
// Append data to the MemBuffer
buffer.Append(pBuff, file_info.uncompressed_size);
unzCloseCurrentFile(uf);
unzClose(uf);
return err;
}
其中關鍵的操作函式就只有7個: