[ASP.NET] C# ZIP壓縮檔處理

C# 本身並無提供ZIP相關的類別,我們可使用 SharpZipLib 這個類別庫來處理壓縮檔,有需要可到 SharpZipLib 官方網站下載:http://www.icsharpcode.net/OpenSource/SharpZipLib/

以下範例是我參考網路範例(C# .NET ZIP Compress),再做些小修改完成的,希望對大家有幫助。

C# 本身並無提供ZIP相關的類別,我們可使用 SharpZipLib 這個類別庫來處理壓縮檔,有需要可到 SharpZipLib 官方網站下載:http://www.icsharpcode.net/OpenSource/SharpZipLib/

以下範例是我參考網路範例(C# .NET ZIP Compress),再做些小修改完成的,希望對大家有幫助。


using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;

namespace ZipTool
{
    public class ZipTool
    {
        /// 
        /// 壓縮整個資料夾
        /// 
        private static void ZipDir(string SourceDir, string TargetFile, string Password, bool BackupOldFile)
        {
            FastZip oZipDir = new FastZip();
            try
            {
                if (!Directory.Exists(SourceDir))
                {
                    throw new Exception("資料夾不存在!");
                }

                if (BackupOldFile == true)
                {
                    //判斷要產生的ZIP檔案是否存在
                    if (File.Exists(TargetFile) == true)
                    {
                        //原本的檔案存在,把他ReName
                        File.Copy(TargetFile, TargetFile + "-" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".back");
                        File.Delete(TargetFile);
                    }
                }

                if (string.IsNullOrEmpty(Password))
                    oZipDir.Password = Password;

                oZipDir.CreateZip(TargetFile, SourceDir, true, "");
            }
            catch
            {
                throw;
            }
        }

        /// 
        /// 壓縮整個資料夾
        /// 
        public static void ZipDir(string SourceDir, string TargetFile, string Password)
        {
            ZipDir(SourceDir, TargetFile, Password, true);
        }

        /// 
        /// 壓縮整個資料夾
        /// 
        public static void ZipDir(string SourceDir, string TargetFile)
        {
            ZipDir(SourceDir, TargetFile, "", true);
        }

        /// 
        /// 壓縮檔案
        /// 
        private static void ZipFiles(string[] SourceFiles, string TargetFile, string Password, bool BackupOldFile)
        {
            try
            {
                if (SourceFiles == null || SourceFiles.Length <= 0)
                {
                    throw new Exception("並未傳入檔案完整路徑");
                }

                for (int i = 0; i < SourceFiles.Length; i++)
                {
                    if (File.Exists(SourceFiles[i]) == false)
                    {
                        throw new Exception("要壓縮的檔案【" + SourceFiles[i] + "】不存在");
                    }
                }

                if (BackupOldFile == true)
                {
                    //判斷要產生的ZIP檔案是否存在
                    if (File.Exists(TargetFile) == true)
                    {
                        //原本的檔案存在,把他ReName
                        File.Copy(TargetFile, TargetFile + "-" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".back");
                        File.Delete(TargetFile);
                    }
                }

                ZipOutputStream zs = new ZipOutputStream(File.Create(TargetFile));
                zs.SetLevel(9); //壓縮比
                if (Password != "")
                {
                    zs.Password = Password;
                }

                for (int i = 0; i < SourceFiles.Length; i++)
                {
                    FileStream s = File.OpenRead(SourceFiles[i]);
                    byte[] buffer = new byte[s.Length];
                    s.Read(buffer, 0, buffer.Length);
                    ZipEntry Entry = new ZipEntry(Path.GetFileName(SourceFiles[i]));
                    Entry.DateTime = DateTime.Now;
                    Entry.Size = s.Length;
                    s.Close();
                    zs.PutNextEntry(Entry);
                    zs.Write(buffer, 0, buffer.Length);
                }
                zs.Finish();
                zs.Close();
            }
            catch
            {
                throw;
            }
        }

        /// 
        /// 壓縮檔案
        /// 
        public static void ZipFiles(string[] SourceFiles, string TargetFile, string Password)
        {
            ZipFiles(SourceFiles, TargetFile, Password, true);
        }

        /// 
        /// 壓縮檔案
        /// 
        public static void ZipFiles(string[] SourceFiles, string TargetFile)
        {
            ZipFiles(SourceFiles, TargetFile, "", true);
        }

        /// 
        /// 壓縮單一檔案
        /// 
        public static void ZipFile(string SourceFile, string TargetFile, string Password, bool BackupOldFile)
        {
            ZipFiles(new string[] { SourceFile }, TargetFile, Password, BackupOldFile);
        }

        /// 
        /// 壓縮單一檔案
        /// 
        public static void ZipFile(string SourceFile, string TargetFile, string Password)
        {
            ZipFile(SourceFile, TargetFile, Password, true);
        }

        /// 
        /// 壓縮單一檔案
        /// 
        /// 
        public static void ZipFile(string SourceFile, string TargetFile)
        {
            ZipFile(SourceFile, TargetFile, "", true);
        }

        /// 
        /// 解壓縮
        /// 
        private static void ExtractZip(string SourceFile, string TargetDir, string Password)
        {
            FastZip oZip = new FastZip();
            try
            {
                //判斷ZIP檔案是否存在
                if (File.Exists(SourceFile) == false)
                {
                    throw new Exception("要解壓縮的檔案【" + SourceFile + "】不存在,無法執行");
                }
                if (Password != "")
                {
                    oZip.Password = Password;
                }
                oZip.ExtractZip(SourceFile, TargetDir, "");
            }
            catch
            {
                throw;
            }
        }

        /// 
        /// 解壓縮
        /// 
        public static void ExtractZip(string SourceFile, string TargetDir)
        {
            ExtractZip(SourceFile, TargetDir, "");
        }
    }
}

 

檔案下載:ZipTool.zip

 

參考來源:http://subocheng.blogspot.com/2009/08/c-net-zip-compress_25.html