MYBLOG

欢迎来到小马哥的个人博客~

[原创].net利用ICSharpCode.SharpZipLib进行压缩与解压缩

2020-03-08学海无涯

在这里发布一下之前使用ICSharpCode.SharpZipLib编写的压缩与解压缩的类文件,废话不多讲,代码如下(点我下载):


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ICSharpCode.SharpZipLib.Zip;
namespace COE.Components
{
    public class ICSharpCode
    {
        #region 压缩指定文件生成ZIP文件
        /// <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 static void ZipFile(string topDirName, string[] fileNamesToZip, string ZipedFileName, int CompressionLevel, string password, string comment)
        {
            ZipOutputStream s = new ZipOutputStream(System.IO.File.Open(ZipedFileName, FileMode.Create));
            if (password != null && password.Length > 0)
                s.Password = password;
            if (comment != null && comment.Length > 0)
                s.SetComment(comment);
            s.SetLevel(CompressionLevel); // 0 - means store only to 9 - means best compression  

            foreach (string file in fileNamesToZip)
            {


                if (file.EndsWith("\\")) //如果是文件夹 folder
                {

                    ZipEntry entry = new ZipEntry(file);
                    entry.DateTime = DateTime.Now;
                    s.PutNextEntry(entry);
                }
                else  //文件
                {

                    FileStream fs = File.OpenRead(topDirName + file);    //打开待压缩文件  
                    byte[] buffer = new byte[fs.Length];
                    fs.Read(buffer, 0, buffer.Length);      //读取文件流  
                    ZipEntry entry = new ZipEntry(file);    //新建实例  

                    entry.DateTime = DateTime.Now;

                    entry.Size = fs.Length;
                    fs.Close();

                    s.PutNextEntry(entry);
                    s.Write(buffer, 0, buffer.Length);
                }
            }
            s.Finish();
            s.Close();
        }
        #endregion
        #region 解压缩ZIP文件到指定文件夹
        /// <summary>  
        /// 解压缩ZIP文件到指定文件夹  
        /// </summary>  
        /// <param name="zipfileName">ZIP文件</param>  
        /// <param name="UnZipDir">解压文件夹</param>  
        /// <param name="password">压缩文件密码</param>  
        public static 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;
                while ((theEntry = s.GetNextEntry()) != null)
                {
                    string directoryName = Path.GetDirectoryName(UnZipDir);
                    string pathname = Path.GetDirectoryName(theEntry.Name);
                    string fileName = Path.GetFileName(theEntry.Name);

                    //生成解压目录   
                    pathname = pathname.Replace(":", "$");//处理压缩时带有盘符的问题  
                    directoryName = directoryName + "\\" + pathname;
                    Directory.CreateDirectory(directoryName);

                    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();
                    }
                }
                s.Close();
            }
            catch (Exception eu)
            {
                throw eu;
            }
            finally
            {
                s.Close();
            }

        }
        #endregion
    }
}