LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C#利用SharpZipLib生成压缩包

admin
2023年12月30日 22:39 本文热度 655

什么是SharpZipLib ?

SharpZipLib是一个开源的C#压缩解压库,应用非常广泛。就像用ADO.NET操作数据库要打开连接、执行命令、关闭连接等多个步骤一样,用SharpZipLib进行压缩和解压也需要多个步骤。

SharpZipLib功能比较强大,在很多C#的应用中,都有它的身影,我们可以通过引入SharpZipLib类库文件,在程序中实现自动压缩文件以及解压缩文件的功能,例如一个常见的情景就是用户客户端程序下载更新包,下载完成之后,在本地自动解压文件。

在工程中引用SharpZipLib

在项目中,点击项目名称右键-->管理NuGet程序包,打开NuGet包管理器窗口,进行搜索下载即可,如下图所示:

SharpZipLib的关键类结构图

如下所示:

涉及知识点:

  • ZipOutputStream 压缩输出流,将文件一个接一个的写入压缩文档,此类不是线程安全的。

  • PutNextEntry 开始一个新的ZIP条目,ZipOutputStream中的方法。

  • ZipEntry 一个ZIP文件中的条目,可以理解为压缩包里面的一个文件夹/文件。

  • ZipInputStream 解压缩输出流,从压缩包中一个接一个地读出文档。

  • GetNextEntry 读出ZIP条目,ZipInputStream中的方法。

示例效果图:

关于解压缩小例子的示例效果图,如下:

核心代码

using ICSharpCode.SharpZipLib.Checksum;

using ICSharpCode.SharpZipLib.Zip;

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace DemoZip

{

    class ZipHelper

    {

        private string rootPath = string.Empty;

 

        #region 压缩

 

        /// <summary>

        /// 递归压缩文件夹的内部方法

        /// </summary>

        /// <param name="folderToZip">要压缩的文件夹路径</param>

        /// <param name="zipStream">压缩输出流</param>

        /// <param name="parentFolderName">此文件夹的上级文件夹</param>

        /// <returns></returns>

        private  bool ZipDirectory(string folderToZip, ZipOutputStream zipStream, string parentFolderName)

        {

            bool result = true;

            string[] folders, files;

            ZipEntry ent = null;

            FileStream fs = null;

            Crc32 crc = new Crc32();

 

            try

            {

                string entName = folderToZip.Replace(this.rootPath, string.Empty)+"/";

                //Path.Combine(parentFolderName, Path.GetFileName(folderToZip) + "/")

                ent = new ZipEntry(entName);

                zipStream.PutNextEntry(ent);

                zipStream.Flush();

 

                files = Directory.GetFiles(folderToZip);

                foreach (string file in files)

                {

                    fs = File.OpenRead(file);

 

                    byte[] buffer = new byte[fs.Length];

                    fs.Read(buffer, 0, buffer.Length);

                    ent = new ZipEntry(entName + Path.GetFileName(file));

                    ent.DateTime = DateTime.Now;

                    ent.Size = fs.Length;

 

                    fs.Close();

 

                    crc.Reset();

                    crc.Update(buffer);

 

                    ent.Crc = crc.Value;

                    zipStream.PutNextEntry(ent);

                    zipStream.Write(buffer, 0, buffer.Length);

                }

 

            }

            catch

            {

                result = false;

            }

            finally

            {

                if (fs != null)

                {

                    fs.Close();

                    fs.Dispose();

                }

                if (ent != null)

                {

                    ent = null;

                }

                GC.Collect();

                GC.Collect(1);

            }

 

            folders = Directory.GetDirectories(folderToZip);

            foreach (string folder in folders)

                if (!ZipDirectory(folder, zipStream, folderToZip))

                    return false;

 

            return result;

        }

 

        /// <summary>

        /// 压缩文件夹

        /// </summary>

        /// <param name="folderToZip">要压缩的文件夹路径</param>

        /// <param name="zipedFile">压缩文件完整路径</param>

        /// <param name="password">密码</param>

        /// <returns>是否压缩成功</returns>

        public  bool ZipDirectory(string folderToZip, string zipedFile, string password)

        {

            bool result = false;

            if (!Directory.Exists(folderToZip))

                return result;

 

            ZipOutputStream zipStream = new ZipOutputStream(File.Create(zipedFile));

            zipStream.SetLevel(6);

            if (!string.IsNullOrEmpty(password)) zipStream.Password = password;

 

            result = ZipDirectory(folderToZip, zipStream, "");

 

            zipStream.Finish();

            zipStream.Close();

 

            return result;

        }

 

        /// <summary>

        /// 压缩文件夹

        /// </summary>

        /// <param name="folderToZip">要压缩的文件夹路径</param>

        /// <param name="zipedFile">压缩文件完整路径</param>

        /// <returns>是否压缩成功</returns>

        public  bool ZipDirectory(string folderToZip, string zipedFile)

        {

            bool result = ZipDirectory(folderToZip, zipedFile, null);

            return result;

        }

 

        /// <summary>

        /// 压缩文件

        /// </summary>

        /// <param name="fileToZip">要压缩的文件全名</param>

        /// <param name="zipedFile">压缩后的文件名</param>

        /// <param name="password">密码</param>

        /// <returns>压缩结果</returns>

        public  bool ZipFile(string fileToZip, string zipedFile, string password)

        {

            bool result = true;

            ZipOutputStream zipStream = null;

            FileStream fs = null;

            ZipEntry ent = null;

 

            if (!File.Exists(fileToZip))

                return false;

 

            try

            {

                fs = File.OpenRead(fileToZip);

                byte[] buffer = new byte[fs.Length];

                fs.Read(buffer, 0, buffer.Length);

                fs.Close();

 

                fs = File.Create(zipedFile);

                zipStream = new ZipOutputStream(fs);

                if (!string.IsNullOrEmpty(password)) zipStream.Password = password;

                ent = new ZipEntry(Path.GetFileName(fileToZip));

                zipStream.PutNextEntry(ent);

                zipStream.SetLevel(6);

 

                zipStream.Write(buffer, 0, buffer.Length);

 

            }

            catch

            {

                result = false;

            }

            finally

            {

                if (zipStream != null)

                {

                    zipStream.Finish();

                    zipStream.Close();

                }

                if (ent != null)

                {

                    ent = null;

                }

                if (fs != null)

                {

                    fs.Close();

                    fs.Dispose();

                }

            }

            GC.Collect();

            GC.Collect(1);

 

            return result;

        }

 

        /// <summary>

        /// 压缩文件

        /// </summary>

        /// <param name="fileToZip">要压缩的文件全名</param>

        /// <param name="zipedFile">压缩后的文件名</param>

        /// <returns>压缩结果</returns>

        public  bool ZipFile(string fileToZip, string zipedFile)

        {

            bool result = ZipFile(fileToZip, zipedFile, null);

            return result;

        }

 

        /// <summary>

        /// 压缩文件或文件夹

        /// </summary>

        /// <param name="fileToZip">要压缩的路径</param>

        /// <param name="zipedFile">压缩后的文件名</param>

        /// <param name="password">密码</param>

        /// <returns>压缩结果</returns>

        public  bool Zip(string fileToZip, string zipedFile, string password)

        {

            bool result = false;

            if (Directory.Exists(fileToZip))

            {

                this.rootPath = Path.GetDirectoryName(fileToZip);

                result = ZipDirectory(fileToZip, zipedFile, password);

            }

            else if (File.Exists(fileToZip))

            {

                this.rootPath = Path.GetDirectoryName(fileToZip);

                result = ZipFile(fileToZip, zipedFile, password);

            }

            return result;

        }

 

        /// <summary>

        /// 压缩文件或文件夹

        /// </summary>

        /// <param name="fileToZip">要压缩的路径</param>

        /// <param name="zipedFile">压缩后的文件名</param>

        /// <returns>压缩结果</returns>

        public  bool Zip(string fileToZip, string zipedFile)

        {

            bool result = Zip(fileToZip, zipedFile, null);

            return result;

 

        }

 

        #endregion

 

        #region 解压

 

        /// <summary>

        /// 解压功能(解压压缩文件到指定目录)

        /// </summary>

        /// <param name="fileToUnZip">待解压的文件</param>

        /// <param name="zipedFolder">指定解压目标目录</param>

        /// <param name="password">密码</param>

        /// <returns>解压结果</returns>

        public bool UnZip(string fileToUnZip, string zipedFolder, string password)

        {

            bool result = true;

            FileStream fs = null;

            ZipInputStream zipStream = null;

            ZipEntry ent = null;

            string fileName;

 

            if (!File.Exists(fileToUnZip))

                return false;

 

            if (!Directory.Exists(zipedFolder))

                Directory.CreateDirectory(zipedFolder);

 

            try

            {

                zipStream = new ZipInputStream(File.OpenRead(fileToUnZip));

                if (!string.IsNullOrEmpty(password)) zipStream.Password = password;

                while ((ent = zipStream.GetNextEntry()) != null)

                {

                    if (!string.IsNullOrEmpty(ent.Name))

                    {

                        fileName = Path.Combine(zipedFolder, ent.Name);

                        fileName = fileName.Replace('/', '\\');//change by Mr.HopeGi

 

                        if (fileName.EndsWith("\\"))

                        {

                            Directory.CreateDirectory(fileName);

                            continue;

                        }

 

                        fs = File.Create(fileName);

                        int size = 2048;

                        byte[] data = new byte[size];

                        while (true)

                        {

                            size = zipStream.Read(data, 0, data.Length);

                            if (size > 0)

                                fs.Write(data, 0, data.Length);

                            else

                                break;

                        }

                    }

                }

            }

            catch

            {

                result = false;

            }

            finally

            {

                if (fs != null)

                {

                    fs.Close();

                    fs.Dispose();

                }

                if (zipStream != null)

                {

                    zipStream.Close();

                    zipStream.Dispose();

                }

                if (ent != null)

                {

                    ent = null;

                }

                GC.Collect();

                GC.Collect(1);

            }

            return result;

        }

 

        /// <summary>

        /// 解压功能(解压压缩文件到指定目录)

        /// </summary>

        /// <param name="fileToUnZip">待解压的文件</param>

        /// <param name="zipedFolder">指定解压目标目录</param>

        /// <returns>解压结果</returns>

        public bool UnZip(string fileToUnZip, string zipedFolder)

        {

            bool result = UnZip(fileToUnZip, zipedFolder, null);

            return result;

        }

 

        #endregion

    }

备注

关于生成压缩的方法还有很多,如通过命令行调用winrar的执行文件,SharpZipLib只是方法之一。

关于SharpZipLib的的API文档,可参看链接:nuget.org/packages/Shar


该文章在 2023/12/31 16:57:27 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved