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");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章