c#打包文件解压缩的实例

 更新时间:2017年11月21日 21:24:58   作者:浅苍蓝  
下面小编就为大家分享一篇c#打包文件解压缩的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

 

首先要引用一下类库:using Ionic.Zip;这个类库可以到网上下载。

下面对类库使用的封装方法:

得到指定的输入流的ZIP压缩流对象

/// <summary>
      /// 得到指定的输入流的ZIP压缩流对象【原有流对象不会改变】
      /// </summary>
      /// <param name="sourceStream"></param>
      /// <returns></returns>
      public static Stream ZipCompress(Stream sourceStream, string entryName = "zip")
      {
        MemoryStream compressedStream = new MemoryStream();
        if (sourceStream != null)
        {
          long sourceOldPosition = 0;
          try
          {
            sourceOldPosition = sourceStream.Position;
            sourceStream.Position = 0;
            using (ZipFile zip = new ZipFile())
            {
              zip.AddEntry(entryName, sourceStream);
              zip.Save(compressedStream);
              compressedStream.Position = 0;
            }
          }
          catch
          {
          }
          finally
          {
            try
            {
              sourceStream.Position = sourceOldPosition;
            }
            catch
            {
            }
          }
        }
        return compressedStream;
      }

得到指定的字节数组的ZIP解压流对象

/// <summary>
      /// 得到指定的字节数组的ZIP解压流对象
      /// 当前方法仅适用于只有一个压缩文件的压缩包,即方法内只取压缩包中的第一个压缩文件
      /// </summary>
      /// <param name="sourceStream"></param>
      /// <returns></returns>
      public static Stream ZipDecompress(byte[] data)
      {
        Stream decompressedStream = new MemoryStream();
        if (data != null)
        {
          try
          {
            MemoryStream dataStream = new MemoryStream(data);
            using (ZipFile zip = ZipFile.Read(dataStream))
            {
              if (zip.Entries.Count > 0)
              {
                zip.Entries.First().Extract(decompressedStream);
                // Extract方法中会操作ms,后续使用时必须先将Stream位置归零,否则会导致后续读取不到任何数据
                // 返回该Stream对象之前进行一次位置归零动作
                decompressedStream.Position = 0;
              }
            }
          }
          catch
          {
          }
        }
        return decompressedStream;
      }

压缩ZIP文件

/// <summary>
      /// 压缩ZIP文件
      /// 支持多文件和多目录,或是多文件和多目录一起压缩
      /// </summary>
      /// <param name="list">待压缩的文件或目录集合</param>
      /// <param name="strZipName">压缩后的文件名</param>
      /// <param name="IsDirStruct">是否按目录结构压缩</param>
      /// <returns>成功:true/失败:false</returns>
      public static bool CompressMulti(List<string> list, string strZipName, bool IsDirStruct)
      {
        try
        {
          using (ZipFile zip = new ZipFile(Encoding.Default))//设置编码,解决压缩文件时中文乱码
          {
            foreach (string path in list)
            {
              string fileName = Path.GetFileName(path);//取目录名称
              //如果是目录
              if (Directory.Exists(path))
              {
                if (IsDirStruct)//按目录结构压缩
                {
                  zip.AddDirectory(path, fileName);
                }
                else//目录下的文件都压缩到Zip的根目录
                {
                  zip.AddDirectory(path);
                }
              }
              if (File.Exists(path))//如果是文件
              {
                zip.AddFile(path,"imges");
              }
            }
            zip.Save(strZipName);//压缩
            return true;
          }
        }
        catch (Exception)
        {
          return false;
        }
      }

解压ZIP文件

/// <summary>
      /// 解压ZIP文件
      /// </summary>
      /// <param name="strZipPath">待解压的ZIP文件</param>
      /// <param name="strUnZipPath">解压的目录</param>
      /// <param name="overWrite">是否覆盖</param>
      /// <returns>成功:true/失败:false</returns>
      public static bool Decompression(string strZipPath, string strUnZipPath, bool overWrite)
      {
        try
        {
          ReadOptions options = new ReadOptions();
          options.Encoding = Encoding.Default;//设置编码,解决解压文件时中文乱码
          using (ZipFile zip = ZipFile.Read(strZipPath, options))
          {
            foreach (ZipEntry entry in zip)
            {
              if (string.IsNullOrEmpty(strUnZipPath))
              {
                strUnZipPath = strZipPath.Split('.').First();
              }
              if (overWrite)
              {
                entry.Extract(strUnZipPath, ExtractExistingFileAction.OverwriteSilently);//解压文件,如果已存在就覆盖
              }
              else
              {
                entry.Extract(strUnZipPath, ExtractExistingFileAction.DoNotOverwrite);//解压文件,如果已存在不覆盖
              }
            }
            return true;
          }
        }
        catch (Exception)
        {
          return false;
        }
      }

以上动图由“图斗罗”提供

这篇c#打包文件解压缩的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • c#重写TabControl控件实现关闭按钮的方法

    c#重写TabControl控件实现关闭按钮的方法

    这是关于c#重写TabControl控件实现关闭按钮的例子,整理了一下,与大家分享。
    2013-04-04
  • C#中Span相关的性能优化建议

    C#中Span相关的性能优化建议

    Span 是C#7.2引入的一种新类型,在.NET Core 2.1运行时中受支持,Span 提供对内存连续区域的类型安全访问,这篇文章主要给大家介绍了关于C#中Span相关的一些性能优化建议,需要的朋友可以参考下
    2021-08-08
  • c# 实现窗体拖到屏幕边缘自动隐藏

    c# 实现窗体拖到屏幕边缘自动隐藏

    让窗体拖到屏幕边缘自动隐藏的原理,通过Form1_LocationChanged的方法,当窗体位置发生改变时,判断其是否在屏幕边缘,在则隐藏。再通过Timer控件经过指定时间判断出鼠标的位置,若鼠标在屏幕左边、上边或右边,这根据窗体的位置,调出窗体。
    2009-02-02
  • C# 3DES加密详解

    C# 3DES加密详解

    3Des对每个数据块进行了三次的DES加密算法,是DES的一个更安全的变形。比起最初的DES,3DES更为安全。下面我们来看下在C#中的3DES加密方式的使用
    2015-06-06
  • Unity之Luaframework框架lua调用C#方法

    Unity之Luaframework框架lua调用C#方法

    这篇文章主要介绍了Unity之Luaframework框架lua调用C#方法,在这里需要写一个C#脚本,脚本里写方法需要在lua中调用,具体实例代码参考下本文吧
    2021-09-09
  • C#中使用Interlocked进行原子操作的技巧

    C#中使用Interlocked进行原子操作的技巧

    使用.NET提供的Interlocked类可以对一些数据进行原子操作,看起来似乎跟lock锁一样,但它并不是lock锁,它的原子操作是基于CPU本身的,非阻塞的,所以要比lock的效率高
    2016-12-12
  • C#连接Oracle数据库字符串(引入DLL)的方式

    C#连接Oracle数据库字符串(引入DLL)的方式

    这篇文章主要给大家介绍了关于C#连接Oracle数据库字符串(引入DLL)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • C#实现计算器功能

    C#实现计算器功能

    这篇文章主要为大家详细介绍了C#实现计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • automation服务器不能创建对象 解决方法

    automation服务器不能创建对象 解决方法

    本文主要介绍如何解决“automation服务器不能创建对象”错误,从而解决Visual Studio.Net不能正常使用的问题,需要的朋友可以参考下。
    2016-06-06
  • C# 汉字与拼音互转的实现示例

    C# 汉字与拼音互转的实现示例

    本文主要介绍了C# 汉字与拼音互转的实现示例,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论