C# ICSharpCode 壓縮解壓 幫助類

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

namespace THIS.Utility
{
    public class ZipUtility
    {
        private static byte[] buffer = new byte[2048];

        /// <summary>
        /// 壓縮文件
        /// </summary>
        /// <param name="fileToZip">要壓縮的文件路徑</param>
        /// <param name="zipedFile">壓縮後的文件路徑</param>
        /// <param name="compressionLevel">壓縮率 0 - 9 默認 5</param>
        public static void ZipFile(string fileToZip, string zipedFile, int compressionLevel = 5)
        {
            if (!File.Exists(fileToZip))
            {
                throw new FileNotFoundException("The specified file " + fileToZip + " could not be found.");
            }

            using (ZipOutputStream zipStream = new ZipOutputStream(File.Create(zipedFile)))
            {
                string fileName = Path.GetFileName(fileToZip);
                ZipEntry zipEntry = new ZipEntry(fileName);
                zipStream.PutNextEntry(zipEntry);
                zipStream.SetLevel(compressionLevel);

                using (FileStream streamToZip = new FileStream(fileToZip, FileMode.Open, FileAccess.Read))
                {
                    while (true)
                    {
                        int size = streamToZip.Read(buffer, 0, buffer.Length);
                        if (size < 1)
                            break;
                        zipStream.Write(buffer, 0, size);
                    }
                }
            }
        }

        /// <summary>
        /// 壓縮文件夾
        /// </summary>
        /// <param name="directoryToZip">要壓縮的文件夾路徑</param>
        /// <param name="zipedDirectory">壓縮或的文件夾路徑</param>
        /// <param name="compressionLevel">壓縮率 0 - 9 默認 5</param>
        public static void ZipDerctory(string directoryToZip, string zipedFileName, int compressionLevel = 5)
        {
            using (ZipOutputStream zipStream = new ZipOutputStream(File.Create(zipedFileName)))
            {
                ArrayList fileList = GetFileList(directoryToZip);
                int directoryNameLength = (Directory.GetParent(directoryToZip)).ToString().Length;

                zipStream.SetLevel(compressionLevel);
                ZipEntry zipEntry = null;
                FileStream fileStream = null;

                foreach (string fileName in fileList)
                {
                    zipEntry = new ZipEntry(fileName.Remove(0, directoryNameLength));
                    zipStream.PutNextEntry(zipEntry);
                    if (!fileName.EndsWith(@"/"))
                    {
                        fileStream = File.OpenRead(fileName);

                        while (true)
                        {
                            int readCount = fileStream.Read(buffer, 0, buffer.Length);
                            if (readCount < 1)
                                break;
                            zipStream.Write(buffer, 0, readCount);
                        }
                    }
                }
            }
        }

        /// <summary>
        /// 得到文件下的所有文件
        /// </summary>
        /// <param name="directory">文件夾路徑</param>
        /// <returns></returns>
        private static ArrayList GetFileList(string directory)
        {
            ArrayList fileList = new ArrayList();
            bool isEmpty = true;
            foreach (string file in Directory.GetFiles(directory))
            {
                fileList.Add(file);
                isEmpty = false;
            }
            if (isEmpty)
            {
                if (Directory.GetDirectories(directory).Length == 0)
                {
                    fileList.Add(directory + @"/");
                }
            }
            foreach (string dirs in Directory.GetDirectories(directory))
            {
                foreach (object obj in GetFileList(dirs))
                {
                    fileList.Add(obj);
                }
            }
            return fileList;
        }

        /// <summary>
        /// 解壓縮文件
        /// </summary>
        /// <param name="zipFilePath">壓縮文件路徑和文件名 eg:D:\aa.zip</param>
        /// <param name="unZipFilePatah">解壓縮文件存放路徑 eg:D:\aa\</param>
        public static void UnZipFile(string zipFilePath, string unZipFilePatah)
        {
            //如果目錄不存在則創建
            if (!Directory.Exists(unZipFilePatah))
                Directory.CreateDirectory(unZipFilePatah);
            using (ZipInputStream zipStream = new ZipInputStream(File.OpenRead(zipFilePath)))
            {
                ZipEntry zipEntry = null;
                while ((zipEntry = zipStream.GetNextEntry()) != null)
                {
                    string fileName = Path.GetFileName(zipEntry.Name);
                    if (!string.IsNullOrEmpty(fileName))
                    {
                        if (zipEntry.CompressedSize == 0)
                            break;
                        using (FileStream stream = File.Create(unZipFilePatah + fileName))
                        {
                            while (true)
                            {
                                int size = zipStream.Read(buffer, 0, buffer.Length);
                                if (size > 0)
                                {
                                    stream.Write(buffer, 0, size);
                                }
                                else
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }

        /// <summary>
        /// 解壓縮目錄
        /// </summary>
        /// <param name="zipDirectoryPath">壓縮目錄路徑 eg:D:\aaa.zip</param>
        /// <param name="unZipDirecotyPath">解壓縮目錄路徑 eg:D:\aaaa\</param>
        public static void UnZipDirectory(string zipDirectoryPath, string unZipDirecotyPath)
        {
            //如果目錄不存在則創建
            if (!Directory.Exists(unZipDirecotyPath))
                Directory.CreateDirectory(unZipDirecotyPath);
            using (ZipInputStream zipStream = new ZipInputStream(File.OpenRead(zipDirectoryPath)))
            {
                ZipEntry zipEntry = null;
                while ((zipEntry = zipStream.GetNextEntry()) != null)
                {
                    string directoryName = Path.GetDirectoryName(zipEntry.Name);
                    string fileName = Path.GetFileName(zipEntry.Name);
                    directoryName = unZipDirecotyPath + directoryName;
                    if (!string.IsNullOrEmpty(directoryName))
                    {
                        Directory.CreateDirectory(directoryName);
                    }
                    if (!string.IsNullOrEmpty(fileName))
                    {
                        if (zipEntry.CompressedSize == 0)
                            break;
                        if (zipEntry.IsDirectory)
                        {
                            directoryName = Path.GetDirectoryName(unZipDirecotyPath + zipEntry.Name);
                            Directory.CreateDirectory(directoryName);
                        }

                        using (FileStream stream = File.Create(unZipDirecotyPath + zipEntry.Name))
                        {
                            while (true)
                            {
                                int size = zipStream.Read(buffer, 0, buffer.Length);
                                if (size > 0)
                                {
                                    stream.Write(buffer, 0, size);
                                }
                                else
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章