首页 > 作文

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

更新时间:2023-04-04 05:28:40 阅读: 评论:0

最近项目需要实现多文件打包的功能,尝试了一些方法,最后发现使用 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.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 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图