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

下载地址在这里:http://dotnetzip.codeplex.com/

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

然后引用这个命名空间:

using Ionic.Zip;

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

复制代码 代码如下:

///


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

    ///


    public static class ZipUtils

    {

        ///


        /// 得到指定的输入流的ZIP压缩流对象【原有流对象不会改变】

        ///


        ///

        ///

        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解压流对象

        /// 当前方法仅适用于只有一个压缩文件的压缩包,即方法内只取压缩包中的第一个压缩文件

        ///


        ///

        ///

        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文件

        /// 支持多文件和多目录,或是多文件和多目录一起压缩

        ///


        /// 待压缩的文件或目录集合

        /// 压缩后的文件名

        /// 是否按目录结构压缩

        /// 成功:true/失败:false

        public static bool CompressMulti(List 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;

            }

        }

        ///


        /// 解压ZIP文件

        ///


        /// 待解压的ZIP文件

        /// 解压的目录

        /// 是否覆盖

        /// 成功:true/失败:false

        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 list = new List();

  list.Add(@"D:Testss");

  list.Add(@"D:Testtest1.jpg");

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

  list.Add(@"D:Testss.xml");

  bool isSuc =ZipUtils. CompressMulti(list, "D:\Test2.zip",true);

2.解压文件

复制代码 代码如下:

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


0.224341s