最近项目需要实现多文件打包的功能,尝试了一些方法,最后发现使用 icsharpcode.sharpziplib 最符合项目的要求。
具体实现如下:
①压缩文件夹
/// <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.tlevel(6); //压缩级别0-9 createzip(dir, zipstream); filename = dest; zipstream.finish(); zipstream.clo(); } 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); } el //如果不是则压缩 { 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.clo(); crc.re瑞文穿墙t(); 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.tlevel(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.ret(); 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); } el { return url.substring(ur乙酸乙酯结构简式l.lastindexof("\\") + 1); } }
通过此方法生成的压缩包,所有文件都会显示在同一层。
③如果需要在文件中创建目录,需要在文件名称上指定文件路径
添加工具类:
/// <summary> /// 文件对象 /// </summary> public class fileitem { /// <summary> /// 文件名称 /// </summary> public string filename { get; t; } /// <summary> /// 文件路径 /// </summary> public string fileurl { get; t; } }压缩文件的方法:/// <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.tlevel(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); zi党积极分子思想汇报pstream.write(buffer, 0, buffer.length); } } } catch (exception ex) { error = "文件打包失败:" + ex.message; } return url; }
调用参数示例:
{ "zipname": "test.zip", "filelist": [ { "filename": "123.png", "fileurl": "/d/file/titlepic/11c6de395fcc484faf4745ade62cf6e6.png" }, { "filename": "123/456/789.jpg", "fileurl": "/d/file/titlepic/fe922b250acf4344b8ca4d2aad6e0355.jpg" } ]}
生成的结果:
到此这篇关于.net core 多文件打包压缩的实现代码的文章就介绍到这了,更多相关.net core 多文件打包压缩内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 05:28:37,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/e185a01ec50d09e5fc196b52327d53b3.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:.Net Core 多文件打包压缩的实现代码.doc
本文 PDF 下载地址:.Net Core 多文件打包压缩的实现代码.pdf
留言与评论(共有 0 条评论) |