zoukankan      html  css  js  c++  java
  • 利用ZipArchive库进行压缩和解压文件

    最近需要修改以前做的一个下载程序,主要是增加压缩和解压的功能,以减少网络带宽的消耗.去论坛咨询了一下网友,于是借助开源库ZipArchive来实现我要的功能。

    初步看了一下ZipArchive文档,简单地封装了一下压缩和解压功能.代码如下:

    /*
    * CompressZipFile: 压缩文件
    * lpszFile: 需要压缩的文件
    * lpszZipFile: 要压缩到的目标文件
    * bAppend: 标志是否添加到现有压缩文件
    * 返回压缩成功与否
    */
    BOOL  CompressZipFile( LPCTSTR lpszFile, LPCTSTR lpszZipFile, BOOL  bAppend 
    = FALSE )
    {
        
    //如果是追加到现有压缩文件,但现有压缩文件不存在的话  直接返回失败
        if( bAppend && ( !::PathFileExists( lpszZipFile ) ) )
            
    return FALSE;

        
    int nMode = bAppend ? CZipArchive::zipOpen : CZipArchive::zipCreate;
        CZipArchive zipArchive;
        
    if!zipArchive.Open( lpszZipFile, nMode ) )
            
    return FALSE;

        
    //获取路径中的文件名部分
        TCHAR szFile[MAX_PATH];
        lstrcpy( szFile, lpszFile );
        ::PathStripPath( szFile );

        
    bool  bRet = zipArchive.AddNewFile( lpszFile, szFile );

        zipArchive.Close();

        
    return bRet;

    }

    /*
    *  ExtractZipFile : 解压指定文件
    * lpszZipFile: 要解压的文件
    * lpszDestPath: 指定解压到的目录
    * 返回压缩成功与否
    */
    BOOL  ExtractZipFile( LPCTSTR lpszZipFile, LPCTSTR lpszDestPath )
    {
        
    if!::PathFileExists( lpszZipFile ))
            
    return FALSE;

        CZipArchive zipArchive;
        
    if!zipArchive.Open( lpszZipFile, CZipArchive::zipOpenReadOnly ) )
            
    return FALSE;

        
    for ( int nIndex = 0;  nIndex < zipArchive.GetCount (); nIndex++ )
        {
            
    if!zipArchive.ExtractFile( (WORD)nIndex, lpszDestPath ) )
                
    break;
        }
        zipArchive.Close();

        
    return TRUE;
    }

    压缩文件夹可以参考如下的Demo:

        CZipArchive zipArchive;
        
    if!zipArchive.Open( _T("D:\\手绘古景.zip") , CZipArchive::zipCreate ) )
            
    return;
        
    //压缩目录下的所有文件,第三个参数指示是否递归压缩子目录,第五个参数指示是否连文件夹目录一起压缩
        zipArchive.AddNewFiles( _T("D:\\手绘古景\\"), _T("*.*"), true-1false );    
        zipArchive.Close();
  • 相关阅读:
    基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD)
    C# 实现AOP 的几种常见方式
    SignalR的另类实现技巧
    通过winform+模拟登录实现快速一键登录到人才招聘网站
    Winform应用程序实现通用遮罩层二
    近期开发项目中用到的编码小技巧汇总说明
    详解:基于WEB API实现批量文件由一个服务器同步快速传输到其它多个服务器功能
    关于Quartz.NET作业调度框架的一点小小的封装,实现伪AOP写LOG功能
    trackViewer 氨基酸位点变异位置图谱展示
    python基础-PyYaml操作yaml文件
  • 原文地址:https://www.cnblogs.com/fangkm/p/1437003.html
Copyright © 2011-2022 走看看