///
///
文件所在目录
///
压缩包目录
///
///
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