狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C#利用SharpZipLib生成壓縮包

admin
2023年12月30日 22:39 本文熱度 842

什么是SharpZipLib ?

SharpZipLib是一個開源的C#壓縮解壓庫,應(yīng)用非常廣泛。就像用ADO.NET操作數(shù)據(jù)庫要打開連接、執(zhí)行命令、關(guān)閉連接等多個步驟一樣,用SharpZipLib進(jìn)行壓縮和解壓也需要多個步驟。

SharpZipLib功能比較強(qiáng)大,在很多C#的應(yīng)用中,都有它的身影,我們可以通過引入SharpZipLib類庫文件,在程序中實現(xiàn)自動壓縮文件以及解壓縮文件的功能,例如一個常見的情景就是用戶客戶端程序下載更新包,下載完成之后,在本地自動解壓文件。

在工程中引用SharpZipLib

在項目中,點擊項目名稱右鍵-->管理NuGet程序包,打開NuGet包管理器窗口,進(jìn)行搜索下載即可,如下圖所示:

SharpZipLib的關(guān)鍵類結(jié)構(gòu)圖

如下所示:

涉及知識點:

  • ZipOutputStream 壓縮輸出流,將文件一個接一個的寫入壓縮文檔,此類不是線程安全的。

  • PutNextEntry 開始一個新的ZIP條目,ZipOutputStream中的方法。

  • ZipEntry 一個ZIP文件中的條目,可以理解為壓縮包里面的一個文件夾/文件。

  • ZipInputStream 解壓縮輸出流,從壓縮包中一個接一個地讀出文檔。

  • GetNextEntry 讀出ZIP條目,ZipInputStream中的方法。

示例效果圖:

關(guān)于解壓縮小例子的示例效果圖,如下:

核心代碼

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>

        /// 遞歸壓縮文件夾的內(nèi)部方法

        /// </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>壓縮結(jié)果</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>壓縮結(jié)果</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>壓縮結(jié)果</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>壓縮結(jié)果</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">指定解壓目標(biāo)目錄</param>

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

        /// <returns>解壓結(jié)果</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">指定解壓目標(biāo)目錄</param>

        /// <returns>解壓結(jié)果</returns>

        public bool UnZip(string fileToUnZip, string zipedFolder)

        {

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

            return result;

        }

 

        #endregion

    }

備注

關(guān)于生成壓縮的方法還有很多,如通過命令行調(diào)用winrar的執(zhí)行文件,SharpZipLib只是方法之一。

關(guān)于SharpZipLib的的API文檔,可參看鏈接:nuget.org/packages/Shar


該文章在 2023/12/31 16:57:27 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved