首页 > 作文

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

更新时间:2023-04-04 05:34:56 阅读: 评论: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);  //获得当前文件路径的文件名                        zip2021感恩节entry entry = new zipentry(tempfilename);                        entry.datetime = datetime.now;                        entry.size = fs.length;                        fs.clo();                        crc.ret();                        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(url.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.cre练腹肌最好的方法atedirectory(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);                        zipstream.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"    }  ]}

生成的结果:

以上所述是www.887551.com给大家介绍的.net core框架下c#实现多文件打包压缩的方法,希望对大家有所帮助。在此也非常感谢大家对www.887551.com网站的支持!

本文发布于:2023-04-04 05:34:54,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/452bcc588d5ddcbaec626ab3be02a9f3.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:C#实现多文件打包压缩(.Net Core).doc

本文 PDF 下载地址:C#实现多文件打包压缩(.Net Core).pdf

标签:文件   路径   文件名   线上
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图