ZipUtility 解压

using System;

using System.Collections.Generic;
using System.Text;
using Microsoft.Win32;
using System.Diagnostics;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using SwireBev.Mobile.Utility;

namespace MobileTest
{
    public class ZipUtility
    {
        public delegate void ThreadStop(int zipType, int fileIndex, string status, string title);                                //线程操作完成
        public event ThreadStop threadStop;

        /// <summary>
        /// 写入ZIP
        /// </summary>
        /// <param name="zos"></param>
        /// <param name="topDirName"></param>
        /// <param name="pathStr"></param>
        /// <param name="index"></param>
        /// <param name="absolute"></param>
        private void addZipWrite(ZipOutputStream zos, string topDirName, string pathStr, int index, string absolute)
        {
            string strEntryName = pathStr;
            if (!topDirName.Equals(""))
            {
                strEntryName = pathStr.Replace(topDirName, "");
            }
            try
            {
                FileStream fs = File.OpenRead(pathStr);
                byte[] buffer = new byte[fs.Length];
                fs.Read(buffer, 0, buffer.Length);
                ZipEntry entry = new ZipEntry(Path.GetFileName(strEntryName));
                if (absolute.Equals("0"))
                {
                    entry = new ZipEntry(strEntryName);
                }
                zos.PutNextEntry(entry);
                zos.Write(buffer, 0, buffer.Length);
                fs.Close();
                threadStop(0, index, "OK", Path.GetFileName(strEntryName));
            }
            catch
            {
                threadStop(0, index, "Error", Path.GetFileName(strEntryName));
            }
        }

        /// <summary>
        /// 回调
        /// </summary>
        /// <param name="zos"></param>
        /// <param name="topDirName"></param>
        /// <param name="pathStr"></param>
        /// <param name="absolute"></param>
        private void addZipEntry(ZipOutputStream zos, string topDirName, string pathStr, string absolute)
        {
            if (!Path.GetFileName(pathStr).Equals(""))
            {
                addZipWrite(zos, topDirName, pathStr, 0, absolute);
            }
            else
            {
                DirectoryInfo di = new DirectoryInfo(pathStr);
                foreach (DirectoryInfo item in di.GetDirectories())
                {
                    addZipEntry(zos, topDirName, item.FullName, absolute);
                }
                int index = 0;
                foreach (FileInfo item in di.GetFiles())
                {
                    addZipWrite(zos, topDirName, item.FullName, index++, absolute);
                }
            }
        }


        
        /// <summary>  
        /// 压缩指定文件生成ZIP文件  
        /// </summary>  
        /// <param name="topDirName">顶层文件夹名称</param>  
        /// <param name="fileNamesToZip">待压缩文件列表</param>  
        /// <param name="ZipedFileName">ZIP文件</param>  
        /// <param name="CompressionLevel">压缩比</param>  
        /// <param name="password">密码</param>  
        /// <param name="comment">压缩文件注释文字</param>  
        public void ZipFile
            (
            string topDirName,  //顶层文件夹名称 \Storage Card\PDADataExchange\send\xml\
            string[][] fileNamesToZip,  //待压缩文件列表  new string[2]{"version.xml","0")  0 相对 包含文件夹 1 绝对 不包含文件夹
            string zipFileName,   //ZIP文件  \Storage Card\PDADataExchange\send\zip\version.zip
            int CompressionLevel,    //压缩比  7
            string password,    //密码   ""
            string comment   //压缩文件注释文字  ""
            )
        {
            ZipOutputStream zos = new ZipOutputStream(System.IO.File.Open(zipFileName, FileMode.Create));

            if (password != null && password.Length > 0)
                zos.Password = password;

            if (comment != null && comment.Length > 0)
                zos.SetComment(comment);

            zos.SetLevel(CompressionLevel); // 0 - means store only to 9 - means best compression  
            if (fileNamesToZip.Length > 0)
            {
                foreach (string[] file in fileNamesToZip)
                {
                    string filePath = topDirName + file[0];
                    addZipEntry(zos, topDirName, filePath, file[1]);
                }
            }
            else
            {
                string filePath = topDirName;
                addZipEntry(zos, topDirName, filePath, "0");
            }
            zos.Finish();
            zos.Close();
        }

        /// <summary>  
        /// 解压缩ZIP文件到指定文件夹  
        /// </summary>  
        /// <param name="zipfileName">ZIP文件</param>  
        /// <param name="UnZipDir">解压文件夹</param>  
        /// <param name="password">压缩文件密码</param>  
        public void UnZipFile(string zipFileName, string UnZipDir, string password)
        {
            ZipInputStream s = new ZipInputStream(File.OpenRead(zipFileName));
            if (password != null && password.Length > 0)
                s.Password = password;
            try
            {
                ZipEntry theEntry;
                int index = 0;
                while ((theEntry = s.GetNextEntry()) != null)
                {
                    string directoryName = Path.GetDirectoryName(UnZipDir);
                    string pathname = Path.GetDirectoryName(theEntry.Name);
                    string fileName = Path.GetFileName(theEntry.Name);
                    string file = "";
                    try
                    {
                        //生成解压目录   
                        pathname = pathname.Replace(":", "$");//处理压缩时带有盘符的问题  
                        directoryName = directoryName + "\\" + pathname;
                        Directory.CreateDirectory(directoryName);
                        file = directoryName + "\\" + fileName;
                        if (fileName != String.Empty)
                        {
                            //解压文件到指定的目录  
                            FileStream streamWriter = File.Create(directoryName + "\\" + fileName);

                            int size = 2048;
                            byte[] data = new byte[2048];
                            while (true)
                            {
                                size = s.Read(data, 0, data.Length);
                                if (size > 0)
                                {
                                    streamWriter.Write(data, 0, size);
                                }
                                else
                                {
                                    break;
                                }
                            }
                            streamWriter.Close();
                        }
                        if (File.Exists(file))
                        {
                            if (threadStop != null)
                            {
                                if (threadStop != null)
                                {
                                    if (!Path.GetFileName(zipFileName).Equals(Path.GetFileName(file)))
                                    {
                                        threadStop(1, index++, "OK", Path.GetFileName(file));
                                    }
                                }
                            }
                        }
                        
                    }
                    catch
                    {
                        if (File.Exists(file))
                        {
                            if (threadStop != null)
                            {
                                if (threadStop != null)
                                {
                                    if (!Path.GetFileName(zipFileName).Equals(Path.GetFileName(file)))
                                    {
                                        threadStop(1, index++, "Error", Path.GetFileName(file));
                                    }
                                }
                            }
                        }
                    }
                    
                }
                s.Close();
            }
            catch (Exception eu)
            {
                throw eu;
            }
            finally
            {
                s.Close();
            }

        }
    }
}
原文地址:https://www.cnblogs.com/xsmhero/p/2882825.html