用法:
[ResponseCache(Duration = 0)] public IActionResult DownloadFile() { //NUGET 安装 SharpZipLib ZipSugar zc = new ZipSugar(); string webRootPath = _webHostEnvironment.ContentRootPath+"\\A\\";//压缩文件目录 //压缩后的Zip文件路径 var zippath = webRootPath+ "1.zip"; if(System.IO.File.Exists(zippath))//如果压缩包存在删除已有压缩文件 { System.IO.File.Delete(zippath); } //需要压缩的文件夹 zc.CreateZip(webRootPath, zippath); return File(zc.FileContent(zippath), "application/octet-stream", "附件.zip") ; }
代码:
using ICSharpCode.SharpZipLib.Checksum; using ICSharpCode.SharpZipLib.Zip; using System; using System.IO; using System.Text; public class ZipSugar { #region 递归压缩 /// <summary> /// 递归压缩 /// </summary> /// <param name="FolderToZip"></param> /// <param name="s"></param> /// <param name="ParentFolderName"></param> private bool ActionFileDictory(string FolderToZip, ZipOutputStream s, string ParentFolderName) { bool res = true; string[] folders, filenames; ZipEntry entry = null; FileStream fs = null; Crc32 crc = new Crc32(); try { //创建当前文件夹 entry=new ZipEntry (Path.Combine(ParentFolderName,Path.GetFileName(FolderToZip) + "/"));//加上“/”才会当成是文件夹创建 s.PutNextEntry(entry); s.Flush(); //先压缩文件,再递归压缩文件夹 filenames = Directory.GetFiles(FolderToZip); foreach (string file in filenames) { if (file.Contains(".rar") || file.Contains(".zip")) { continue; } //打开压缩文件 fs = File.OpenRead(file); byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); entry = new ZipEntry (Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip)+"/"+Path.GetFileName(file))); entry.DateTime = DateTime.Now; entry.Size = fs.Length; fs.Close(); crc.Reset(); crc.Update(buffer); entry.Crc = crc.Value; s.PutNextEntry(entry); s.Write(buffer, 0, buffer.Length); } } catch { res = false; } finally { if (fs != null) { fs.Close(); fs = null; } if (entry != null) entry = null; GC.Collect(); GC.Collect(1); } folders = Directory.GetDirectories(FolderToZip); foreach (string folder in folders) { if (!ActionFileDictory(folder, s, Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip)))) return false; } return res; } #endregion #region 压缩目录 /// <summary> /// 压缩目录 /// </summary> private string ActionFileDictory(string FolderToZip, string ZipedFile, string Password) { bool res; if (!Directory.Exists(FolderToZip)) return "错误"; ZipOutputStream s = new ZipOutputStream(File.Create(ZipedFile)); s.SetLevel(6); if (!string.IsNullOrEmpty(Password.Trim())) s.Password = Password.Trim(); res = ActionFileDictory(FolderToZip, s, ""); s.Finish(); s.Close(); if (res) { return ZipedFile; } else { return null; } } #endregion #region 压缩文件 /// <summary> /// 压缩文件 /// </summary> /// <param name="FileToZip">要进行压缩的文件名</param> /// <param name="ZipedFile">压缩后生成的压缩文件名</param> /// <returns></returns> private string AcintonFile(string FileToZip, string ZipedFile, string Password) { //如果文件没有找到,则报错 if (!File.Exists(FileToZip)) throw new System.IO.FileNotFoundException("指定要压缩的文件: " + FileToZip + " 不存在!"); //FileStream fs = null; FileStream ZipFile = null; ZipOutputStream ZipStream = null; ZipEntry ZipEntry = null; string res; try { ZipFile = File.OpenRead(FileToZip); byte[] buffer = new byte[ZipFile.Length]; ZipFile.Read(buffer, 0, buffer.Length); ZipFile.Close(); ZipFile = File.Create(ZipedFile); ZipStream = new ZipOutputStream(ZipFile); if (!string.IsNullOrEmpty(Password.Trim())) ZipStream.Password = Password.Trim(); ZipEntry = new ZipEntry(Path.GetFileName(FileToZip)); ZipStream.PutNextEntry(ZipEntry); ZipStream.SetLevel(6); ZipStream.Write(buffer, 0, buffer.Length); } catch { res = "错误"; } finally { if (ZipEntry != null) { ZipEntry = null; } if (ZipStream != null) { ZipStream.Finish(); ZipStream.Close(); } if (ZipFile != null) { ZipFile.Close(); ZipFile = null; } GC.Collect(); GC.Collect(1); } return "成功"; } #endregion #region Zip /// <summary> /// 压缩文件 和 文件夹 /// </summary> public string CreateZip(string FileToZip, string ZipedFile, string Password) { if (Directory.Exists(FileToZip)) { return ActionFileDictory(FileToZip, ZipedFile, Password); } else if (File.Exists(FileToZip)) { return AcintonFile(FileToZip, ZipedFile, Password); } else { return "失败"; } } /// <summary> /// 压缩文件 和 文件夹 /// </summary> /// <param name="FileToZip">待压缩的文件或文件夹,全路径格式</param> /// <param name="ZipedFile">压缩后生成的压缩文件名,全路径格式</param> /// <returns></returns> public string CreateZip(string FileToZip, string ZipedFile) { return CreateZip(FileToZip, ZipedFile, ""); } public byte[] FileContent(string fileName) { using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read)) { try { byte[] buffur = new byte[fs.Length]; fs.Read(buffur, 0, (int)fs.Length); return buffur; } catch (Exception ex) { throw ex; } } } #endregion }
2016 © donet5.comApache Licence 2.0