C#如何实现多文件打包压缩
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,C#如何实现多文件打包压缩,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。最近项目需要实现多文件打包的功能,尝试了一些方法
千家信息网最后更新 2025年02月01日C#如何实现多文件打包压缩
C#如何实现多文件打包压缩,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
最近项目需要实现多文件打包的功能,尝试了一些方法,最后发现使用ICSharpCode.SharpZipLib 最符合项目的要求。
具体实现如下:
1.在 Nuget 中安装ICSharpCode.SharpZipLib
2.将要打包的文件放到同个文件夹进行压缩:
①压缩文件夹
////// 压缩文件 /// /// 压缩后获得的文件名 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; } ////// 压缩内容到 zipStream 流中 /// /// 源文件 /// 目标文件流(全路径+文件名+.zip) 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); } } } }
②将指定文件打包压缩 (可打包线上文件)
////// 打包线上线下文件 /// /// 文件列表 /// 保存路径 public static void ZipOnlineFile3(ListfileList, 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); } }
通过此方法生成的压缩包,所有文件都会显示在同一层。
③如果需要在文件中创建目录,需要在文件名称上指定文件路径
添加工具类:
////// 文件对象 /// public class FileItem { ////// 文件名称 /// public string FileName { get; set; } ////// 文件路径 /// public string FileUrl { get; set; } }
压缩文件的方法:
////// 打包线上线下文件 /// /// 压缩文件名称 /// 文件列表 /// 保存路径 public static string ZipFiles(string zipName, ListfileList, 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" } ]}
生成的结果:
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。
文件
路径
名称
文件名
目录
文件夹
方法
级别
内容
项目
帮助
生成
C#
清楚
功能
参数
对此
对象
工具
文章
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
热血传奇服务器不显示登录界面
山东省存储服务器零售
舟山学软件开发总结
互联网科技公司top5
数据库表坏了删不掉
恒生聚源数据库账号
开福区软件开发工程师培训
mc石头世界2服务器
360网络安全学院负责人
天大网络安全校长谈网安专业
excel数据库驱动文件
台式机插服务器内存条后不启动
Oracle数据库搭建及部署
日本软件开发和国内
学习软件开发设计要学什么
信赖的数据库复制
四川高灯科技为哪家互联网合作
苏通网络技术有限公司
宴请小说软件开发
肇庆通信软件开发供应商
广州软件开发和工资待遇
江津区网络安全审计系统咨询费用
16串口服务器
同花顺数据库怎么申请
世界服务器传送点
软件开发类公司的法律风险
贵州飞腾服务器采购
数据库续航测评
与科技结合的互联网项目
网络安全的定义特征和目标