项目中需要对Zip包进行操作.压缩和解压.虽然网上有很多第三方的库.但是不想用第三方的库.
解压的代码网上很多,但是压缩的基本上没有,找了好久都没找到.没办法,只有自己实现,实现如下,留下备忘.也希望别人能够搜索到,少花时间.
//CHN 压缩Zip包
BOOL CProgressDlg::ZipFolder(CString strZipFile, CString strSrcPath)
{
if(!PathFileExists(strZipFile))
{
//CHN 创建Zip包
if (CreateEmptyZip(strZipFile))
{
return FALSE;
}
}
BSTR dest;
BSTR source;
HRESULT hResult;
IShellDispatch *pISD;
Folder *pToFolder = NULL;
VARIANT vDir, vFile, vOpt;
dest = strZipFile.AllocSysString();
source = strSrcPath.AllocSysString();
//CHN 初始化COM库
CoInitialize(NULL);
//CHN 获得 IShellDispatch 接口的指针
hResult = CoCreateInstance
(CLSID_Shell, NULL, CLSCTX_INPROC_SERVER, IID_IShellDispatch, (void **)&pISD);
if (S_OK != hResult)
{
return FALSE;
}
//CHN 初期化
VariantInit(&vDir);
vDir.vt = VT_BSTR;
vDir.bstrVal = dest;
//CHN 创建文件夹对象
hResult = pISD->NameSpace(vDir, &pToFolder);
if (S_OK != hResult)
{
return FALSE;
}
//CHN 初期化
Folder *pFromFolder = NULL;
VariantInit(&vFile);
vFile.vt = VT_BSTR;
vFile.bstrVal = source;
hResult = pISD->NameSpace(vFile, &pFromFolder);
if (S_OK != hResult)
{
return FALSE;
}
//CHN 初期化
VariantInit(&vOpt);
vOpt.vt = VT_I4;
vOpt.lVal = FOF_NO_UI;
//CHN 拷贝文件并添加到Zip包中
hResult = pToFolder->CopyHere(vFile, vOpt);
if(S_OK != hResult)
{
return FALSE;
}
//CHN CopyHere函数会创建一个额外的线程来拷贝文件,可能在这个线程初始化的时候主线程就退出了,所有需要让主线程Sleep一下
Sleep(1000);
//CHN 释放资源
pToFolder->Release();
pFromFolder->Release();
SysFreeString(source);
SysFreeString(dest);
pISD->Release();
//CHN 关闭COM库
CoUninitialize();
return TRUE;
}
//CHN 创建Zip包
BOOL CProgressDlg::CreateEmptyZip(CString strZipFileFullPath)
{
//指定zip 格式
byte btEmptyzip[] = { 80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
//创建zip包
CFile clsFile;
BOOL bResult;
bResult = clsFile.Open((LPCTSTR)(strZipFileFullPath),CFile::modeWrite| CFile::shareExclusive| CFile::modeCreate);
if (bResult)
{
clsFile.Write(btEmptyzip, sizeof(btEmptyzip));
clsFile.Flush();
}
else
{
MessageBox(_T("打开Zip包失败!"));
return FALSE;
}
clsFile.Close();
return TRUE;
}