DotnetZip是一个开源类库,支持.NET的任何语言,可很方便的创建,读取,和更新zip文件。而且还可以使用在.NETCompact Framework中。

下载地址在这里:

http://dotnetzip.codeplex.com/

下载到的包里有很多个dll文件,一般引用Ionic.Zip.dll就可以:

然后引用这个命名空间:

using Ionic.Zip;

以下是我自己封装的一个类:

/// <summary>

    /// Zip操作基于 DotNetZip 的封装

    /// </summary>

    public static class ZipUtils

    {

        /// <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;

        }

 

 

        /// <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;

        }

 

        /// <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);

                        }

                    }

                    zip.Save(strZipName);//压缩

                    return true;

                }

            }

            catch (Exception)

            {

                return false;

            }

        }

 

        /// <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;

            }

        }

 

 

    }

使用方法:

1.压缩文件

  List<string> list = new List<string>();

  list.Add(@"D:\Test\ss");

  list.Add(@"D:\Test\test1.jpg");

  list.Add(@"D:\公司文件.txt");

  list.Add(@"D:\Test\ss.xml"); 
bool isSuc =ZipUtils. CompressMulti(list, "D:\\Test2.zip",true);

2.解压文件

  bool isSuc = ZipUtils.Decompression("D:\\Test\\Test1.zip", "D:\\Teest", true);

更详细的例子在这里:

http://dotnetzip.codeplex.com/wikipage?title=Examples&referringTitle=Home

DotNetZip封装类的更多相关文章

  1. c#使用DotNetZip封装类操作zip文件(创建/读取/更新)实例

    DotnetZip是一个开源类库,支持.NET的任何语言,可很方便的创建,读取,和更新zip文件.而且还可以使用在.NETCompact Framework中.  下载地址在这里:http://dot ...

  2. C#文件的压缩和解压(ZIP)使用DotNetZip封装类操作zip文件(创建/读取/更新)实例

    需要引用Ionic.Zip命名空间 DLL下载地址在这里:http://dotnetzip.codeplex.com/ 文件压缩 /// <summary> /// 压缩ZIP文件 /// ...

  3. C#分布式缓存Couchbase

    C#分布式缓存Couchbase使用 一.简介 目前C#业界使用得最多的 Cache 系统主要是 Memcached和 Redis. 这两个 Cache 系统可以说是比较成熟的解决方案,也是很多系统当 ...

  4. CSS盒模型和定位的类型

    此文根据Steven Bradley的<How Well Do You Understand CSS Positioning?>所译,整个译文带有我自己的理解与思想,如果译得不好或不对之处 ...

  5. 最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)

    在项目开发中,除了对数据的展示更多的就是对文件的相关操作,例如文件的创建和删除,以及文件的压缩和解压.文件压缩的好处有很多,主要就是在文件传输的方面,文件压缩的好处就不需要赘述,因为无论是开发者,还是 ...

  6. c#生成静态html文件,封装类

    由于这段时间比较轻松,于是想到很多的企业网站,新闻网站需要将页面静态化,于是写了个封装类来实现静态文件的生成,思路比较简单,但未完善,网友可根据自己的思路将此类扩展,运用了简单工厂模式(本来刚开始看设 ...

  7. ASP.Net MVC——DotNetZip简单使用,解决文件压缩问题。

    准备工作: 在vs工具栏中找到NuGet 下载DotNetZip 现在就可以使用DotNetZip强大的类库了,在这里我给出一些简单的使用. public ActionResult Export() ...

  8. 使用DOTNETZIP过滤并压缩相对目录

    业务要求: 压缩某个文件夹及其子目录 压缩时只压缩指定的文件类型,如cshtml 压缩后保持相对目录   找了很久,没有直接的DEMO,最后尝试通过以下代码完成 示例演示了只压缩cshtml和js,同 ...

  9. 自动创建WIN32下多级子目录的C++封装类

            这是 WIN32 自动创建多级子目录的 C++ 封装类,用法简单.         封装没有采用类的静态函数方式,而是在构造函数里面直接完成工作.没什么具体的原因,只是当时做成这样了, ...

随机推荐

  1. IIS Web负载均衡的几种方式

    Web负载均衡的几种实现方式 摘要:负载均衡(Load Balance)是集群技术(Cluster)的一种应用.负载均衡可以将工作任务分摊到多个处理单元,从而提高并发处理能力.目前最常见的负载均衡应用 ...

  2. UrlRewriter.dll伪静态实现二级域名泛解析

    大家应该知道,微软的URLRewrite能够对URL进行重写,但是也只能对域名之后的部分进行重写,而不能对域名进行重写, 如:可将 http://http://www.115sou.com/qq/  ...

  3. [反汇编练习] 160个CrackMe之020

    [反汇编练习] 160个CrackMe之020. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  4. 【转】Windows环境下Android Studio v1.0安装教程

    原文网址:http://ask.android-studio.org/?/article/9 http://android-studio.org/index.php/docs/experience/1 ...

  5. java web 学习十三(使用session防止表单重复提交)

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  6. Entity Framework 5.0

    今天 VS2012  .net Framework 4.5   Entity Framework 5.0  三者共同发布了. ( EF5 Released ) 在介绍新特性之前,先与大家回顾一下EF版 ...

  7. 【剑指offer 面试题17】合并两个排序的链表

    思路: 比较两个链表端点值的大小,通过递归的方式排列. #include <iostream> using namespace std; struct ListNode { int val ...

  8. login:用户登陆的意思

    login:用户登陆的意思 在思科的设备上有两种登录方式: 一种是本地方式,使用console口: 一种是远程方式(或者叫做网络方式):使用的是telnet等 1.默认情况下,思科的远程访问是禁止的. ...

  9. 在ubuntu下安装chrome

    To add PPA in Ubuntu 14.04 / 13.10 / 13.04 / 12.10 / 12.04 First download and install the key from G ...

  10. Spring学习笔记(一) Spring基础IOC、AOP

    1.       注入类型 a)       Spring_0300_IOC_Injection_Type b)       setter(重要) c)       构造方法(可以忘记) d)     ...