千家信息网

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(List 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.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, List 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.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"    }  ]}

生成的结果:

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

0