/// /// 文件所在目录 /// 压缩包目录 /// /// public static bool ZipFileDictory(string filePath, string saveZipPath) bool flag = true; if (!Directory.Exists(filePath)) return false; if (string.IsNullOrEmpty(saveZipPath)) //如果压缩后的文件路径为空 则文件名称为 文件名 + .zip saveZipPath += ".zip"; //实例化一个zip文件流 ZipOutputStream zipOutputStream = new ZipOutputStream(File.Create(saveZipPath)); zipOutputStream.SetLevel(6); //设置压缩级别为6级 //调用方法 递归进行压缩 flag = ZipFileDictory(filePath, zipOutputStream, ""); zipOutputStream.Finish(); zipOutputStream.Close(); return flag; /// /// 递归压缩文件夹方法 /// /// 文件路径 /// zip文件流 /// 父类文件名称 /// public static bool ZipFileDictory(string filePath, ZipOutputStream s, string ParentFolderName) bool flag = true; string[] folders, filenames; ZipEntry entry = null; //压缩后的文件目录 FileStream fs = null; //文件数据流 //Crc32 crc = new Crc32(); //创建当前文件夹 entry = new ZipEntry(Path.Combine(ParentFolderName, Path.GetFileName(filePath) + "/")); //加上 “/” 才会当成是文件夹创建 s.PutNextEntry(entry); s.Flush(); //先压缩文件,再递归压缩文件夹 filenames = Directory.GetFiles(filePath); foreach (string file in filenames) itemCount++; ItemCompressed?.Invoke(itemCount); //打开压缩文件 fs = File.OpenRead(file); byte[] buffer = new byte[avg]; entry = new ZipEntry(Path.Combine(ParentFolderName, Path.GetFileName(filePath) + "/" + Path.GetFileName(file))) DateTime = DateTime.Now, Size = fs.Length s.PutNextEntry(entry); for (int i = 0; i < fs.Length; i += avg) if (i + avg > fs.Length) //不足100MB的部分写剩余部分 buffer = new byte[fs.Length - i]; fs.Read(buffer, 0, buffer.Length); s.Write(buffer, 0, buffer.Length); catch flag = false; finally if (fs != null) fs.Close(); GC.Collect(); GC.Collect(1); folders = Directory.GetDirectories(filePath); foreach (string folder in folders) if (!ZipFileDictory(folder, s, Path.Combine(ParentFolderName, Path.GetFileName(filePath)))) return false; return flag;

上面这个方法直接复制进去就行,我们到时候如果报错就是因为少一些引用,比如NuGet包之类的引用。

三、接下来我们就可以进行尝试调用压缩

        [HttpPost]
        public Object UnZipFile()
            //压缩后我们要存放的文职,我这里写的是本项目下的ZipFile文件夹下,并且每次都用一个新的NewGuid命名
            //如果欸有ZipFile文件夹他会自己创建
            var zipPath = Directory.GetCurrentDirectory() + "\\ZipFile\\" + Guid.NewGuid() + ".zip";
            //要压缩的文件夹位置  注意!!!!文件夹位置不是单个文件的位置
            var filePath = "D:\\lei.zhang\\Desktop\\111111";
            //调用我们的辅助类方法
            var flag = Zip.ZipFileDictory(filePath,zipPath);
            //返回是否压缩保存成功
            return Ok(flag);

写完以上方法后我们就可以进行尝试压缩了。

稀土掘金地址:.Net Core 项目使用代码把文件打成zip格式压缩包 - 掘金 (juejin.cn)

var filename = "测试压缩解压文件"; var path = Directory.GetCurrentDirectory() + "/wwwroot/file/" + filename + ".pdf"; //这里是获取到文件的byte数组 byte[] fileBuffer1 =... ZipFile.CreateFromDirectory(string pathName, string fileName);//压缩 参数 pathName 为要压缩的目录的路径,指定为相对或绝对路径。相对路径被解释为相对于当前工作目录。 参数 fileName 要创建的压缩文件路径,指定为相对或绝对路径。相对路径被解释为相对于当前工作目录。 ZipFile.ExtractToDir