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. UVa 12063 (DP) Zeros and Ones

    题意: 找出长度为n.0和1个数相等.没有前导0且为k的倍数的二进制数的个数. 分析: 这道题要用动态规划来做. 设dp(zeros, ones, mod)为有zeros个0,ones个1,除以k的余 ...

  2. bzoj1221: [HNOI2001] 软件开发

    挖坑.我的那种建图方式应该也是合理的.然后连样例都过不了.果断意识到应该为神奇建图法... #include<cstdio> #include<cstring> #includ ...

  3. php linux部署相关

    http://www.itbulu.com/wdcp-php55.html http://www.wdlinux.cn/wdcp/install.html http://www.yiichina.co ...

  4. LeetCode Invert Binary Tree 反转二叉树

    思路:递归解决,在返回root前保证该点的两个孩子已经互换了.注意可能给一个Null. C++ /** * Definition for a binary tree node. * struct Tr ...

  5. dpkg-query

    1.功能作用 查看软件包信息 2.位置 /usr/bin 3.格式用法 dpkg-query [<选项> ...] <命令> 4.主要参数 Commands: -s|--sta ...

  6. iOS开发实践:一个类微博客户端从启动到与用户交互的过程

    本文基于数据字典和数据流图两种工具讲述一个完整微博客户端的实现.数据字典和数据流图都可以用来表达线程的执行流程,同时定义了需要的类,是进一步设计类的基础. 数据字典实际上是一张表,表的第一个字段是程序 ...

  7. <一>SQL优化1-4

    第一条:去除在谓词列上编写的任何标量函数        --->在select 显示列上使用标量函数是可以的.但在where语句后的过滤条件部分对列使用函数,需要考虑.因为执行sql的引擎会因为 ...

  8. 【二叉树、堆】15轻院校赛-J-堆

    原题:http://acm.zzuli.edu.cn/problem.php?cid=1099&pid=9 [描述] [输入] [输出] Sample Input 3 1 10 3 10 5 ...

  9. 【转】堆栈跟踪中收到一个UnhandledExceptionFilter调用时,如何查找问题异常堆栈

    定义没有异常处理程序来处理引发的异常时调用UnhandledExceptionFilter函数.函数通常将异常传递到捕获并处理它所尝试的 Ntdll.dll 文件. 在某些情况下,在其中存在的进程内存 ...

  10. .NET之美——1.1 C#中的泛型

    1.1 C#中的泛型 .Net 1.1版本最受诟病的一个缺陷就是没有提供对泛型的支持.通过使用泛型,我们可以极大地提高代码的重用度,同时还可以获得强类型的支持,避免了隐式的装箱.拆箱,在一定程度上提升 ...