本片帖子是记录.Net core 如何压缩文件夹下的内容成为.zip的压缩文件,并且存到指定的位置。
一、首先我们下载NuGet包
这是第一步,我们接下来的代码需要用到这个NuGet包,来进行压缩文件。
二、创建辅助类也就是压缩文件的中心部分
using ICSharpCode.SharpZipLib.Zip;
namespace Zipped.Commed
{
public class Zip
{
/// <summary>
/// 100MB写入一次
/// </summary>
public static int avg = 1024 * 1024 * 100;
/// <summary>
/// 压缩项
/// </summary>
public static event Action<int> ItemCompressed;
/// <summary>
/// 每一项的个数
/// </summary>
public static int itemCount = 0;
/// <summary>
/// 压缩目录
/// </summary>
/// <param name="filePath">文件所在目录</param>
/// <param name="saveZipPath">压缩包目录</param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
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;
}
/// <summary>
/// 递归压缩文件夹方法
/// </summary>
/// <param name="filePath">文件路径</param>
/// <param name="s">zip文件流</param>
/// <param name="ParentFolderName">父类文件名称</param>
/// <returns></returns>
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();
try
{
//创建当前文件夹
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);
}
写完以上方法后我们就可以进行尝试压缩了。