c#壓縮和解壓縮文件

環境:

  • window 10
  • .netcore 3.1.1
  • .netframework 4.5
  • vs2019 16.5.0

第一步:引入nuget包:SharpZipLib

在這裏插入圖片描述

第二步:編寫幫助類ZipHelper

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

namespace HttpUpAndDownloadFile
{
    public static class ZipHelper
    {
        static ZipHelper()
        {
            //消除文件名中文亂碼
            ICSharpCode.SharpZipLib.Zip.ZipStrings.CodePage = Encoding.UTF8.CodePage;
        }

        #region 壓縮文件
        /// <summary>
        /// 壓縮文件
        /// </summary>
        /// <param name="dest">目的文件,如: c:\test.zip</param>
        /// <param name="fileAbsPaths">文件來源列表,如: c:\test.txt,d:\test.db</param>
        public static void ZipFile(string dest, params string[] fileAbsPaths)
        {
            using (var fs = new FileStream(dest, FileMode.Create))
            {
                var zipOutputStream = new ZipOutputStream(fs);
                foreach (var i in fileAbsPaths)
                {
                    ZipSingleFile(zipOutputStream, i);
                };
                zipOutputStream.Finish();
                zipOutputStream.Close();
            }
        }

        private static void ZipSingleFile(ZipOutputStream zipOutputStream, string filePath, string folderName = "")
        {
            var fileInfo = new FileInfo(filePath);
            string fileName = Path.Combine(folderName, fileInfo.Name);
            ZipEntry zipEntry = new ZipEntry(Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(fileName)));
            zipEntry.DateTime = DateTime.Now;
            zipEntry.Size = fileInfo.Length;
            zipOutputStream.PutNextEntry(zipEntry);
            using (var fs = new FileStream(fileInfo.FullName, FileMode.Open))
            {
                fs.CopyTo(zipOutputStream);
            }
        }

        private static void ZipSingleFolder(ZipOutputStream zipOutputStream, string folderPath, string folderName = "")
        {
            string[] directorys = Directory.GetDirectories(folderPath);
            foreach (var i in directorys)
            {
                var tmp = Path.Combine(folderName, new DirectoryInfo(i).Name);
                ZipSingleFolder(zipOutputStream, i, tmp);
            }
            string[] files = Directory.GetFiles(folderPath);
            foreach (var i in files)
            {
                ZipSingleFile(zipOutputStream, i, folderName);
            }
        }

        /// <summary>
        /// 遞歸壓縮文件夾
        /// </summary>
        /// <param name="dest">目的文件名稱,如: c:\test.zip</param>
        /// <param name="folderPaths">壓縮的目錄列表,如: c:\test,d:\jack</param>
        public static void ZipFolder(string dest, params string[] folderPaths)
        {
            using (var fs = new FileStream(dest, FileMode.Create))
            {
                var zipOutputStream = new ZipOutputStream(fs);
                foreach (var i in folderPaths)
                {
                    ZipSingleFolder(zipOutputStream, i, new DirectoryInfo(i).Name);
                };
                zipOutputStream.Finish();
                zipOutputStream.Close();
            }
        }
        #endregion

        #region 解壓縮文件
        /// <summary>
        /// 解壓縮文件到指定文件夾
        /// </summary>
        /// <param name="srcZipFile">源壓縮文件</param>
        /// <param name="destDir">目標文件夾</param>
        /// <returns></returns>
        public static void UnZipFile(string srcZipFile, string destDir)
        {
            //讀取壓縮文件(zip文件),準備解壓縮
            ZipInputStream inputstream = new ZipInputStream(File.OpenRead(srcZipFile.Trim()));
            ZipEntry entry;
            string path = destDir;
            //解壓出來的文件保存路徑
            string rootDir = "";
            //根目錄下的第一個子文件夾的名稱
            while ((entry = inputstream.GetNextEntry()) != null)
            {
                rootDir = Path.GetDirectoryName(entry.Name);
                //得到根目錄下的第一級子文件夾的名稱
                if (rootDir.IndexOf("\\") >= 0)
                {
                    rootDir = rootDir.Substring(0, rootDir.IndexOf("\\") + 1);
                }
                string dir = Path.GetDirectoryName(entry.Name);
                //得到根目錄下的第一級子文件夾下的子文件夾名稱
                string fileName = Path.GetFileName(entry.Name);
                //根目錄下的文件名稱
                if (dir != "")
                {
                    //創建根目錄下的子文件夾,不限制級別
                    if (!Directory.Exists(destDir + "\\" + dir))
                    {
                        path = destDir + "\\" + dir;
                        //在指定的路徑創建文件夾
                        Directory.CreateDirectory(path);
                    }
                }
                else if (dir == "" && fileName != "")
                {
                    //根目錄下的文件
                    path = destDir;
                }
                else if (dir != "" && fileName != "")
                {
                    //根目錄下的第一級子文件夾下的文件
                    if (dir.IndexOf("\\") > 0)
                    {
                        //指定文件保存路徑
                        path = destDir + "\\" + dir;
                    }
                }
                if (dir == rootDir)
                {
                    //判斷是不是需要保存在根目錄下的文件
                    path = destDir + "\\" + rootDir;
                }

                //以下爲解壓zip文件的基本步驟
                //基本思路:遍歷壓縮文件裏的所有文件,創建一個相同的文件
                if (fileName != String.Empty)
                {
                    FileStream fs = File.Create(path + "\\" + fileName);
                    int size = 2048;
                    byte[] data = new byte[2048];
                    while (true)
                    {
                        size = inputstream.Read(data, 0, data.Length);
                        if (size > 0)
                        {
                            fs.Write(data, 0, size);
                        }
                        else
                        {
                            break;
                        }
                    }
                    fs.Close();
                }
            }
            inputstream.Close();
        }


        #endregion

    }
}

第三步:測試

private static void TestUnZipFile()
{
    ZipHelper.UnZipFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestZipFolder.zip"), @"C:\Users\AUAS\Desktop\test22");
}
private static void TestZipFolder()
{
    ZipHelper.ZipFolder(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestZipFolder.zip"), @"C:\Users\AUAS\Desktop\test", @"E:\jackletter\codes\圖紙項目\測試提取圖名");
}
private static void TestZipFile()
{
    ZipHelper.ZipFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestZipFile.zip"), @"C:\Users\AUAS\Desktop\test\testupload.db", @"C:\Users\AUAS\Desktop\test\b\testupload.txt");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章