C#实现多文件打包压缩(.Net Core)

最近项目需要实现多文件打包的功能,尝试了一些方法,最后发现使用ICSharpCode.SharpZipLib 最符合项目的要求。

具体实现如下:

1.在 Nuget 中安装ICSharpCode.SharpZipLib

2.将要打包的文件放到同个文件夹进行压缩:

①压缩文件夹

/// <summary>
        /// 压缩文件
        /// </summary>
        /// <param name="fileName">压缩后获得的文件名</param>
        public static bool CompressFile(string dir, out string fileName)
        {
            string dest = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop) + "\\" + string.Format("{0:yyyyMMddHHmmss}", DateTime.Now) + ".zip";   //默认压缩在桌面上
            if (!Directory.Exists(Path.GetDirectoryName(dest)))   //文件不存在就根据路径创建  E:\\test
                Directory.CreateDirectory(Path.GetDirectoryName(dest));
            using (ZipOutputStream zipStream = new ZipOutputStream(File.Create(dest)))
            {
                zipStream.SetLevel(6);   //压缩级别0-9
                CreateZip(dir, zipStream);
                fileName = dest;
                zipStream.Finish();
                zipStream.Close();
            }
            return true;
        }
        /// <summary>
        /// 压缩内容到 zipStream 流中
        /// </summary>
        /// <param name="source">源文件</param>
        /// <param name="zipStream">目标文件流(全路径+文件名+.zip)</param>

        private static void CreateZip(string source, ZipOutputStream zipStream)
        {
            Crc32 crc = new Crc32();
            string[] files = Directory.GetFileSystemEntries(source);  //获得所有文件名称和目录名称
            foreach (var file in files)
            {
                if (Directory.Exists(file))    //如果是文件夹里有文件则递归
                {
                    CreateZip(file, zipStream);
                }
                else    //如果不是则压缩
                {
                    using (FileStream fs = File.OpenRead(file))
                    {
                        byte[] buffer = new byte[fs.Length];
                        fs.Read(buffer, 0, buffer.Length);
                        string tempFileName = file.Substring(file.LastIndexOf("\\") + 1);  //获得当前文件路径的文件名
                        ZipEntry entry = new ZipEntry(tempFileName);
                        entry.DateTime = DateTime.Now;
                        entry.Size = fs.Length;
                        fs.Close();
                        crc.Reset();
                        crc.Update(buffer);
                        entry.Crc = crc.Value;
                        zipStream.PutNextEntry(entry);
                        zipStream.Write(buffer, 0, buffer.Length);
                    }
                }
            }
        }

②将指定文件打包压缩 (可打包线上文件)

/// <summary>
        /// 打包线上线下文件
        /// </summary>
        /// <param name="fileList">文件列表</param>
        /// <param name="savepath">保存路径</param>
        public static void ZipOnlineFile3(List<string> fileList, string savepath)
        {
            //判断保存的文件目录是否存在
            if (!File.Exists(savepath))
            {
                var file = new FileInfo(savepath);
                if (!file.Directory.Exists)
                {
                    file.Directory.Create();
                }
            }

            Crc32 crc = new Crc32();
            using (ZipOutputStream zipStream = new ZipOutputStream(File.Create(savepath)))
            {
                zipStream.SetLevel(9);   //压缩级别0-9  

                foreach (var url in fileList)
                {
                    byte[] buffer = new WebClient().DownloadData(url);
                    string tempFileName = GetFileNameByUrl(url);  //获得当前文件路径的文件名
                    ZipEntry entry = new ZipEntry(tempFileName);
                    entry.DateTime = DateTime.Now;
                    entry.Size = buffer.Length;
                    crc.Reset();
                    crc.Update(buffer);
                    zipStream.PutNextEntry(entry);
                    zipStream.Write(buffer, 0, buffer.Length);
                }
            }
        }

从文件路径读取文件名的方法:

public static string GetFileNameByUrl(string url)
        {
            //判断路径是否为空
            if (string.IsNullOrWhiteSpace(url)) return null;

            //判断是否为线上文件
            if (url.ToLower().StartsWith("http"))
            {
                return url.Substring(url.LastIndexOf("/") + 1);
            }
            else
            {
                return url.Substring(url.LastIndexOf("\\") + 1);
            }
        }

通过此方法生成的压缩包,所有文件都会显示在同一层。

③如果需要在文件中创建目录,需要在文件名称上指定文件路径

添加工具类:

/// <summary>
    /// 文件对象
    /// </summary>
    public class FileItem
    {
        /// <summary>
        /// 文件名称
        /// </summary>
        public string FileName { get; set; }
        /// <summary>
        /// 文件路径
        /// </summary>
        public string FileUrl { get; set; }
    }

压缩文件的方法:

/// <summary>
        /// 打包线上线下文件
        /// </summary>
        /// <param name="zipName">压缩文件名称</param>
        /// <param name="fileList">文件列表</param>
        /// <param name="savepath">保存路径</param>
        public static string ZipFiles(string zipName, List<FileItem> fileList, out string error)
        {
            error = string.Empty;

            string path = string.Format("/files/zipFiles/{0}/{1}/{2}/", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
            //文件保存目录
            string directory = FileSavePath + path;
            string url = FileHostUrl.TrimEnd('/') + path + zipName;
            string savePath = directory + zipName;

            try
            {
                if (!Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }

                using (ZipOutputStream zipStream = new ZipOutputStream(File.Create(savePath)))
                {
                    zipStream.SetLevel(9);   //压缩级别0-9

                    foreach (var item in fileList)
                    {
                        byte[] buffer = new WebClient().DownloadData(item.FileUrl);
                        ZipEntry entry = new ZipEntry(item.FileName);
                        entry.DateTime = DateTime.Now;
                        entry.Size = buffer.Length;
                        zipStream.PutNextEntry(entry);
                        zipStream.Write(buffer, 0, buffer.Length);
                    }
                }
            }
            catch (Exception ex)
            {
                error = "文件打包失败:" + ex.Message;
            }

            return url;
        }

调用参数示例:

{
  "zipName": "test.zip",
  "fileList": [
    {
      "fileName": "123.png",
      "fileUrl": "https://file.yidongcha.cn/files/uploadfiles/image/2021/11/15/11c6de395fcc484faf4745ade62cf6e6.png"
    },
    {
      "fileName": "123/456/789.jpg",
      "fileUrl": "https://file.yidongcha.cn/files/uploadfiles/image/2021/11/15/fe922b250acf4344b8ca4d2aad6e0355.jpg"
    }
  ]
}

生成的结果:

以上所述是小编给大家介绍的.Net Core框架下C#实现多文件打包压缩的方法,希望对大家有所帮助。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • 详解C#压缩、解压文件夹/文件(带密码)

    前言 今天梳理一下项目中用到的压缩.解压文件夹或文件的方法,发现因为需求不同,已经用了好几个不同组件.今天就好好整理记录下,别下次遇到需求又重头开始了. DotNetZip DotNetZip是一个开源的免费类库,主要提供了快速操作zip文件的工具集,VB.C#任何.Net语言都可以通过它创建.解压缩zip文件.我使用该类库最主要的目的还是因为它可以创建带密码保护的压缩文件. 只有设置了zip.Password = "password"之后,被压缩的文件才会有密码保护 /// <

  • C#压缩或解压rar、zip文件方法实例

    前言 为了便于文件在网络中的传输和保存,通常将文件进行压缩操作,常用的压缩格式有rar.zip和7z,本文将介绍在C#中如何对这几种类型的文件进行压缩和解压,并提供一些在C#中解压缩文件的开源库. 在C#.NET中压缩解压rar文件 rar格式是一种具有专利文件的压缩格式,是一种商业压缩格式,不开源,对解码算法是公开的,但压缩算法是私有的,需要付费,如果需要在您的商业软件中使用rar格式进行解压缩,那么你需要为rar付费,rar在国内很流行是由于盗版的存在,正因为算法是不开源的,所以我们压缩ra

  • C#实现文件压缩与解压的方法示例【ZIP格式】

    本文实例讲述了C#实现文件压缩与解压的方法.分享给大家供大家参考,具体如下: 在企业开发过程中经常会遇到文件的压缩与解压,虽然网上很多流行的压缩文件格式都是RAR的,但是由于RAR不是一个开放的标准,因此ZIP成了更多人的选择.如果你不想自己开发的话可以选择开源的项目,比如SharpZipLib就是一个不错的选择. 组件的使用比较简单,请参照下面的代码.点击下载项目源码. /* * Gary Zhang -- cbcye@live.com * www.cbcye.com * www.quickl

  • 如何用C#实现压缩文件

    一.单文件压缩 场景,文件可能比较大,需要压缩传输,比如上传和下载 /// <summary> /// 单文件压缩 /// </summary> /// <param name="sourceFile">源文件</param> /// <param name="zipedFile">zip压缩文件</param> /// <param name="blockSize"&

  • c#打包文件解压缩的实例

    首先要引用一下类库:using Ionic.Zip;这个类库可以到网上下载. 下面对类库使用的封装方法: 得到指定的输入流的ZIP压缩流对象 /// <summary> /// 得到指定的输入流的ZIP压缩流对象[原有流对象不会改变] /// </summary> /// <param name="sourceStream"></param> /// <returns></returns> public stati

  • C#使用ICSharpCode.SharpZipLib.dll进行文件的压缩与解压功能

    下面给大家介绍C#使用ICSharpCode.SharpZipLib.dll进行文件的压缩与解压功能,具体代码如下所示: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using ICSharpCode.SharpZipLib.Zip; using ICSharpCode.SharpZipLib.Checksums; using Syst

  • C#实现压缩和解压缩的方法示例【Gzip和Zip方式】

    本文实例讲述了C#实现压缩和解压缩的方法.分享给大家供大家参考,具体如下: 使用ICSharpCode.SharpZipLib.dll来压缩/解压(压缩效率比GZip要高一点) public static class ZipUtil { /// <summary> /// 压缩 /// </summary> /// <param name="param"></param> /// <returns></returns&g

  • C#实现多文件打包压缩(.Net Core)

    最近项目需要实现多文件打包的功能,尝试了一些方法,最后发现使用ICSharpCode.SharpZipLib 最符合项目的要求. 具体实现如下: 1.在 Nuget 中安装ICSharpCode.SharpZipLib 2.将要打包的文件放到同个文件夹进行压缩: ①压缩文件夹 /// <summary> /// 压缩文件 /// </summary> /// <param name="fileName">压缩后获得的文件名</param>

  • .Net Core 多文件打包压缩的实现代码

    最近项目需要实现多文件打包的功能,尝试了一些方法,最后发现使用  ICSharpCode.SharpZipLib 最符合项目的要求. 具体实现如下: 1.在 Nuget 中安装  ICSharpCode.SharpZipLib 2.将要打包的文件放到同个文件夹进行压缩: ①压缩文件夹 /// <summary> /// 压缩文件 /// </summary> /// <param name="fileName">压缩后获得的文件名</param

  • java实现文件打包压缩输出到浏览器下载

    文件打包压缩输出到浏览器下载 java批量下载文件打包压缩工具类,输出到浏览器下载,可以自己改名. 一.工具类: 入参 :文件LIst :打包后的名字 :响应到浏览器 /** * 功能:压缩多个文件,输出压缩后的zip文件流 * * @param srcfile:源文件列表 * @param zipFileName:压缩后的文件名 * @param response: Http响应 */ public void zipFiles(List<File> srcfile, String zipFi

  • Grunt针对静态文件的压缩,版本控制打包的实例讲解

    在讲之前先谈谈大致步骤:安装nodejs -> 全局安装grunt -> 项目创建package.json --> 项目安装grunt以及grunt插件 -> 配置Gruntfile.js -> 运行任务 1.安装Node 我们开始之前需要安装Nodejs,如果没有安装的 传送门 安装好了之后,查看是否安装成功,正常是这样的提示 这里建议npm换成淘宝的cnpm,速度杠杠的. 安装命令: npm install cnpm -g -registry=https://regist

  • linux对文件解压或打包压缩的方法

    tar命令用与对文件打包压缩或解压,格式: tar [选项] [文件] 打包并压缩文件: tar -czvf  压缩包名 .tar.gz 解压并展开压缩包: tar -xzvf  压缩包名 .tar.gz 参数 -c  创建压缩文件: -x 解开压缩文件: -t 查看压缩包内有哪些压缩文件: -z 用Gzip解压或压缩: -j 用 bzip2解压或压缩: -v显示压缩或解压的过程: -f目标件名: -p保留原始的权限与属性: -P使用绝对路经来压缩: -C指定解压到的目录: 以上所述是小编给大家

  • Vue实现文件批量打包压缩下载

    上次做了一个选择多个数据生成多个二维码并下载,当时项目催的紧,就简单写了个循环生成二维码下载,一次性会下载很多文件,特别难整理: 刚好这次项目又遇到类似这种功能,需要一次性批量下载多个文件,那么就安排下打包下载吧! 需要用到的是file-saver.jszip两个插件 首先,我们安装这两个插件,在控制台中依次输入下方命令执行 npm install file-saver npm install jszip 上方依赖安装完成,我们在需要实现打包下载的页面中引入这两个插件 import JSZip

  • ASP.NET Web Api 2实现多文件打包并下载文件的实例

    最近由于工作和个人事务,站点也好久没更新了,但这并不影响我对.NET的热情.站点的更新工作还是得想办法抽时间来完成的. 今天利用中午的时间来写一篇关于Asp.Net Web Api下载文件的文章,之前我也写过类似的文章,请见:<ASP.NET(C#) Web Api通过文件流下载文件的实例> 本文以这篇文章的基础,提供了ByteArrayContent的下载以及在下载多个文件时实现在服务器对多文件进行压缩打包后下载的功能. 关于本文中实现的在服务器端用.NET压缩打包文件功能的过程中,使用到了

  • php打包压缩文件之ZipArchive方法用法分析

    本文实例讲述了php打包压缩文件之ZipArchive方法用法.分享给大家供大家参考,具体如下: 前面说到了php打包压缩文件之PclZip方法,今天来说下另一种更为简单的方法,使用ZipArchive来压缩文件.这个是php的扩展类,自php5.2版本以后就已经支持这个扩展,如果你在使用的时候出现错误,查看下php.ini里面的extension=php_zip.dll前面的分号有没有去掉,然后再重启Apache这样才能使用这个类库. 使用ZipArchive压缩文件是非常简单的,php官网已

  • php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件

    总结: 使用PHP下载文件的操作需要给出四个header(),可以参考我的另一篇博文:PHP如何实现下载功能超详细流程分析 计算文件的大小的时候,并不需要先打开文件,通过filesize($filename)就可以看出,如果需要先打开文件的话,filesize可能就会是这样的形式了filesize($filehandle) 向客户端回送数据的是,记得要设置一个buffer,用来指定每次向客户端输出多少数据,如:$buffer=1023.如果不指定的话,就会将整个文件全部写入内存当中,再一次性的讲

  • python打包压缩、读取指定目录下的指定类型文件

    下面通过代码给大家介绍python打包压缩指定目录下的指定类型文件,具体代码如下所示: import os import datetime import tarfile import fnmatch def find_spe_file(root, patterns=['*'], non_cludedir=[]): for root, dirnames, filenames in os.walk(root): for pattern in patterns: for filename in fil

随机推荐