热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

C#利用ICSharpCode.SharpZipLib实现在线压缩和解压缩

本文主要主要介绍了利用ICSharpCode.SharpZipLib第三方的DLL库实现在线压缩和解压缩的功能,并做了相关的代码演示。

压缩包制作也是很多项目中需要用到的功能。比如有大量的文件(假设有10000个)需要上传,1个1个的上传似乎不太靠谱(靠,那得传到什么时候啊?),这时我们可以制作一个压缩包zip,直接传这个文件到服务器端,然后在服务器目录解压,释放里面的文件。

这里我们选用ICSharpCode.SharpZipLib这个类库来实现我们的需求。

下载地址:http://icsharpcode.github.io/SharpZipLib/

该组件支持.NET 1.1, .NET 2.0 (3.5, 4.0), .NET CF 1.0, .NET CF 2.0

ICSharpCode.SharpZipLib提供了两个压缩算法的实现,分别是BZIP2(压缩时间长,压缩率高)和GZIP(压缩效率高,压缩率低)。

先定义一个枚举,用于程序标示是哪个压缩算法。

  /// 
  /// 压缩枚举
  /// 
  public enum ZipEnum
  {
    //压缩时间长,压缩率高
    BZIP2,

    //压缩效率高,压缩率低
    GZIP
  }

单个文件的压缩:

    #region 制作压缩包(单个文件压缩)
    /// 
    /// 制作压缩包(单个文件压缩)
    /// 
    /// 原文件
    /// 压缩文件
    /// 压缩算法枚举
    /// 压缩成功标志
    public static bool ZipFile(string srcFileName, string zipFileName, ZipEnum zipEnum)
    {
      bool flag = true;
      try
      {
        switch (zipEnum)
        {
          case ZipEnum.BZIP2:

            FileStream inStream = File.OpenRead(srcFileName);
            FileStream outStream = File.Open(zipFileName, FileMode.Create);

            //参数true表示压缩完成后,inStream和outStream连接都释放
            BZip2.Compress(inStream, outStream, true, 4096);

            inStream.Close();
            outStream.Close();


            break;
          case ZipEnum.GZIP:

            FileStream srcFile = File.OpenRead(srcFileName);

            GZipOutputStream zipFile = new GZipOutputStream(File.Open(zipFileName, FileMode.Create));

            byte[] fileData = new byte[srcFile.Length];
            srcFile.Read(fileData, 0, (int)srcFile.Length);
            zipFile.Write(fileData, 0, fileData.Length);

            srcFile.Close();
            zipFile.Close();

            break;
          default: break;
        }
      }
      catch
      {
        flag = false;
      }
      return flag;
    }
    #endregion

单个文件的解压缩:

    #region 解压缩包(单个文件解压缩)
    /// 
    /// 解压缩包(单个文件解压缩)
    /// 
    /// 压缩文件
    /// 解压缩文件
    /// 压缩算法枚举
    /// 压缩成功标志
    public static bool UnZipFile(string zipFileName, string unzipFileName, ZipEnum zipEnum)
    {
      bool flag = true;
      try
      {
        switch (zipEnum)
        {
          case ZipEnum.BZIP2:
            FileStream inStream = File.OpenRead(zipFileName);
            FileStream outStream = File.Open(unzipFileName, FileMode.Create);
            BZip2.Decompress(inStream, outStream, true);
            break;
          case ZipEnum.GZIP:
            GZipInputStream zipFile = new GZipInputStream(File.OpenRead(zipFileName));
            FileStream destFile = File.Open(unzipFileName, FileMode.Create);

            int bufferSize = 2048 * 2;
            byte[] fileData = new byte[bufferSize];

            while (bufferSize > 0)
            {
              bufferSize = zipFile.Read(fileData, 0, bufferSize);
              zipFile.Write(fileData, 0, bufferSize);
            }
            destFile.Close();
            zipFile.Close();
            break;
          default: break;
        }
      }
      catch
      {
        flag = false;
      }
      return flag;
    }
    #endregion

上面的两个方法在引用了dll后,可以直接使用。
看到这里,相信读者有疑问了,如果我想让多个文件压缩到1个zip包里呢?甚至可以给文件加密?给zip包加注释?
好吧,我这里继续贴两个方法,都经过测试,可用。

多文件的压缩:

    #region 制作压缩包(多个文件压缩到一个压缩包,支持加密、注释)
    /// 
    /// 制作压缩包(多个文件压缩到一个压缩包,支持加密、注释)
    /// 
    /// 压缩文件目录
    /// 压缩包文件名
    /// 压缩级别 1-9
    /// 密码
    /// 注释
    public static void ZipFiles(string topDirectoryName, string zipedFileName, int compresssionLevel, string password, string comment)
    {
      using (ZipOutputStream zos = new ZipOutputStream(File.Open(zipedFileName, FileMode.OpenOrCreate)))
      {
        if (compresssionLevel != 0)
        {
          zos.SetLevel(compresssionLevel);//设置压缩级别
        }

        if (!string.IsNullOrEmpty(password))
        {
          zos.Password = password;//设置zip包加密密码
        }

        if (!string.IsNullOrEmpty(comment))
        {
          zos.SetComment(comment);//设置zip包的注释
        }

        //循环设置目录下所有的*.jpg文件(支持子目录搜索)
        foreach (string file in Directory.GetFiles(topDirectoryName, "*.jpg", SearchOption.AllDirectories))
        {
          if (File.Exists(file))
          {
            FileInfo item = new FileInfo(file);
            FileStream fs = File.OpenRead(item.FullName);
            byte[] buffer = new byte[fs.Length];
            fs.Read(buffer, 0, buffer.Length);

            ZipEntry entry = new ZipEntry(item.Name);
            zos.PutNextEntry(entry);
            zos.Write(buffer, 0, buffer.Length);
          }
        }
      }
    }
    #endregion

多文件的解压缩:

    #region 解压缩包(将压缩包解压到指定目录)
    /// 
    /// 解压缩包(将压缩包解压到指定目录)
    /// 
    /// 压缩包名称
    /// 解压缩目录
    /// 密码
    public static void UnZipFiles(string zipedFileName, string unZipDirectory, string password)
    {
      using (ZipInputStream zis = new ZipInputStream(File.Open(zipedFileName, FileMode.OpenOrCreate)))
      {
        if (!string.IsNullOrEmpty(password))
        {
          zis.Password = password;//有加密文件的,可以设置密码解压
        }

        ZipEntry zipEntry;
        while ((zipEntry = zis.GetNextEntry()) != null)
        {
          string directoryName = Path.GetDirectoryName(unZipDirectory);
          string pathName = Path.GetDirectoryName(zipEntry.Name);
          string fileName = Path.GetFileName(zipEntry.Name);

          pathName = pathName.Replace(".", "$");
          directoryName += "\\" + pathName;

          if (!Directory.Exists(directoryName))
          {
            Directory.CreateDirectory(directoryName);
          }

          if (!string.IsNullOrEmpty(fileName))
          {
            FileStream fs = File.Create(Path.Combine(directoryName, fileName));
            int size = 2048;
            byte[] bytes = new byte[2048];
            while (true)
            {
              size = zis.Read(bytes, 0, bytes.Length);
              if (size > 0)
              {
                fs.Write(bytes, 0, size);
              }
              else
              {
                break;
              }
            }
            fs.Close();
          }
        }
      }
    }
    #endregion

调用时我们可以这么写:

ZipFileUtil.ZipFiles(@"E:\\test\\", "E:\\test.zip", 1, "admin", "this is admin's comment.");//制作压缩包 

ZipFileUtil.UnZipFiles("E:\\test.zip", "E:\\guwei4037\\", "admin");//解压缩包 


推荐阅读
  • windows平台使用NSP拦截具体进程的域名解析过程(xFsRedir的代理功能之域名代理)
    byfanxiushu2022-10-17转载或引用请注明原始作者。xFsRedir软件其中之一的功能就是实现了全方位的网络代理,从主机代理,到本地代理 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • [翻译]微服务设计模式5. 服务发现服务端服务发现
    服务之间需要互相调用,在单体架构中,服务之间的互相调用直接通过编程语言层面的方法调用就搞定了。在传统的分布式应用的部署中,服务地 ... [详细]
  • 一面自我介绍对象相等的判断,equals方法实现。可以简单描述挫折,并说明自己如何克服,最终有哪些收获。职业规划表明自己决心,首先自己不准备继续求学了,必须招工作了。希望去哪 ... [详细]
  • 项目需要将音视频文件上传服务器,考虑并发要求高,通过七牛来实现。直接上代码usingQiniu.IO;usingQiniu.IO.Resumable;usingQiniu.RPC; ... [详细]
  • Hadoop 源码学习笔记(4)Hdfs 数据读写流程分析
    Hdfs的数据模型在对读写流程进行分析之前,我们需要先对Hdfs的数据模型有一个简单的认知。数据模型如上图所示,在NameNode中有一个唯一的FSDirectory类负责维护文件 ... [详细]
  • NFS文件共享系统
    1、概述:NFS(NetworkFileSystem)意为网络文件系统,它最大的功能就是可以通过网络,让不同的机器不同的操作系统可以共享 ... [详细]
  • 提示信息_局域网内互发提示信息
    本文由编程笔记#小编为大家整理,主要介绍了局域网内互发提示信息相关的知识,希望对你有一定的参考价值。【局域网内互发提示信息】准备工作:1.rege ... [详细]
author-avatar
手机用户2602885631_316
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有