c#压缩和解压缩文件

环境:

  • window 10
  • .netcore 3.1.1
  • .netframework 4.5
  • vs2019 16.5.0
第一步:引入nuget包:SharpZipLib
<ItemGroup>
	<PackageReference Include="SharpZipLib" Version="1.2.0" />
</ItemGroup>

在这里插入图片描述

第二步:编写帮助类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;
            //旧版本
            //ICSharpCode.SharpZipLib.Zip.ZipConstants.DefaultCodePage = 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();
            }
        }
        
		/// <summary>
        /// 递归压缩文件夹里的内容,不包含文件夹本身(区别:ZipFolder() )
        /// </summary>
        /// <param name="dest">目的文件名称,如: c:\test.zip</param>
        /// <param name="folderPath">压缩的目录列表,如: c:\test</param>
        public static void ZipFolderContent(string dest, string folderPath)
        {
            using (var fs = new FileStream(dest, FileMode.Create))
            {
                var zipOutputStream = new ZipOutputStream(fs);
                string[] directorys = Directory.GetDirectories(folderPath);
                foreach (var i in directorys)
                {
                    var tmp = Path.Combine(new DirectoryInfo(i).Name);
                    ZipSingleFolder(zipOutputStream, i, tmp);
                }
                string[] files = Directory.GetFiles(folderPath);
                foreach (var i in files)
                {
                    ZipSingleFile(zipOutputStream, i);
                }
                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)
        {
            if (!Directory.Exists(destDir)) Directory.CreateDirectory(destDir);
            using (var stream = new ZipInputStream(File.OpenRead(srcZipFile.Trim())))
            {
                ZipEntry entry;
                while ((entry = stream.GetNextEntry()) != null)
                {
                    if (entry.IsDirectory)
                    {
                        //目录,创建新目录即可
                        var path = Path.Combine(destDir, entry.Name);
                        if (!Directory.Exists(path)) Directory.CreateDirectory(path);
                        continue;
                    }
                    else if (entry.IsFile)
                    {
                        //文件,将文件解压缩
                        var path = Path.Combine(destDir, entry.Name);
                        var dir = Path.GetDirectoryName(path);
                        if (!Directory.Exists(dir)) Directory.CreateDirectory(dir);
                        using (var fs = File.Create(path))
                        {
                            int size = 2048;
                            byte[] data = new byte[2048];
                            while (true)
                            {
                                size = stream.Read(data, 0, data.Length);
                                if (size > 0)
                                {
                                    fs.Write(data, 0, size);
                                }
                                else
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
        #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");
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jackletter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值