C#如何实现多文件打包压缩
发表于:2024-11-20 作者:千家信息网编辑
千家信息网最后更新 2024年11月20日,C#如何实现多文件打包压缩,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。最近项目需要实现多文件打包的功能,尝试了一些方法
千家信息网最后更新 2024年11月20日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安全错误
数据库的锁怎样保障安全
柳市镇软件开发
护苗网络安全课三四腾讯
网络安全英语作文30字
was集群子服务器启动
找钢网的软件开发团队
快速找差异数据库
登录邮箱出现文件服务器找不到
kylin数据库
江苏程序软件开发大概要多少钱
软件开发买什么配置的台式电脑
程序联网控制软件开发
国际网络安全符号大全
移动软件开发h5
服务器硬件检测报告
全校师生同上一节网络安全课
eba串口服务器接温度传感器
恒生电子软件开发好跳槽吗
场景展示数据库设计
qq数据库 查询
陕西省网络安全工作会议
数据库原理课程设计报告书
数据库上机指导
嵌入式数据库和协议栈
广州契家互联网科技有限公司
重庆python软件开发报价
随着科技和互联网的发展
软件开发专业名字
网络安全大会最权威的大会
联想服务器服务
数据库技术课程的收获