Symbian Zip解压问题

Symbian提供了解压ZIP的API,调用可以解压文件。如果知道zip文件中有什么文件,调用api进行解压还马马虎虎。

在实际应用中,如果需要解压某个zip文件,往往不知道这个压缩包中有些什么东西,但要求全部解压出来,这就不太好办了。

其实也可以把zip压缩包中的文件的文件名都列举出来,然后就可以依次读取每个文件了。



TInt CZipMgr::UnZipAd()
{
    TInt nRet = 0;
    CDesCArray* filesList;
    TInt nIdx = 0;
    filesList = new (ELeave) CDesCArrayFlat(30);
    
    if(iZipFile)
    {
        delete iZipFile;
        iZipFile = NULL;
    }    
    
    
    TBuf<260>    strZipPath;
    
    strZipPath.Append(_L("attach.zip"));
    if(!CFileUtils::FileExists(strZipPath))
        goto END;
    
    iZipFile = CZipFile::NewL(iFs, strZipPath);
    
    nRet = GetZipedFiles(*filesList);
    if(0 >= nRet)
        goto END;
    
    for(nIdx = 0; nIdx < filesList->Count(); ++nIdx)
    {
        TFileName     strFName;                
        strFName.Copy((*filesList)[nIdx]);        
        UnZipFile(strFName);
        
    }
END:
    filesList->Reset();
    
    delete filesList;    
    return nRet;
}

TInt CZipMgr::GetZipedFiles(CDesCArray& aFiles)
{
    TInt nRet = 0;
    aFiles.Reset();
    if(!iZipFile)
        goto END;
    
    CZipFileMemberIterator* members = iZipFile->GetMembersL();
    if(!members)
        goto END;
    
    CZipFileMember*         pMem = members->NextL();
    while(pMem)
    {
        aFiles.AppendL(*pMem->Name());
        delete pMem;
        pMem = NULL;
        pMem = members->NextL();
        
    }
    
    nRet = aFiles.Count();
END:
    if(members)
        delete members;
    return nRet;
}

void CZipMgr::UnZipFile(const TDesC& aFile)
{
    if(aFile[aFile.Length() - 1] == '\\')
    {
        return;
    }
    
    if(!iZipFile)
        return;
    
    
    TFileName    strDescPath;
    
    strDescPath.Copy(strRootPath);    
    strDescPath.Append(aFile);
    
    RZipFileMemberReaderStream* stream = NULL;
    
    CZipFileMember* member =iZipFile->CaseInsensitiveMemberL(aFile);
    if(!member)
        goto END;
    
    
    if(KErrNone != iZipFile->GetInputStreamL(member, stream) )
    {
        goto END;
    }
    
    HBufC8* buffer =HBufC8::NewL(member->UncompressedSize());
    TPtr8 bufferPtr(buffer->Des());
    User::LeaveIfError(stream->Read(bufferPtr, member->UncompressedSize()));
    
    CFileUtils::Save(strDescPath, buffer->Des());
END:
    if(member)
        delete member;
    member = NULL;
    
    if(stream)
        delete stream;
    stream = NULL;
    
    if(buffer)
        delete buffer;
    buffer = NULL;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值