using ICSharpCode.SharpZipLib.Checksum;
namespace MiaoYu.Core.Zips;
///
/// 压缩 zip https://www.cnblogs.com/xielong/p/6165550.html
///
public class Zip
{
public Zip(string strFile, string strZip)
{
var len = strFile.Length;
var strLen = strFile[len - 1];
if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar)
{
strFile += Path.DirectorySeparatorChar;
}
using var outStream = new ZipOutputStream(File.Create(strZip));
try
{
outStream.SetLevel(6);
Execute(strFile, outStream, strFile);
}
finally
{
outStream.Finish();
outStream.Close();
}
}
private void Execute(string strFile, ZipOutputStream outStream, string staticFile)
{
if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar)
{
strFile += Path.DirectorySeparatorChar;
}
var crc = new Crc32();
//获取指定目录下所有文件和子目录文件名称
var filenames = Directory.GetFileSystemEntries(strFile);
//遍历文件
foreach (var file in filenames)
{
if (Directory.Exists(file))
{
Execute(file, outStream, staticFile);
}
//否则,直接压缩文件
else
{
//打开文件
using var fs = File.OpenRead(file);
//定义缓存区对象
var buffer = new byte[fs.Length];
//通过字符流,读取文件
fs.Read(buffer, 0, buffer.Length);
//得到目录下的文件(比如:D:\Debug1\test),test
var tempFile = file.Substring(staticFile.LastIndexOf("\\", StringComparison.Ordinal) + 1);
var entry = new ZipEntry(tempFile) { DateTime = DateTime.Now, Size = fs.Length };
crc.Reset();
crc.Update(buffer);
entry.Crc = crc.Value;
outStream.PutNextEntry(entry);
//写文件
outStream.Write(buffer, 0, buffer.Length);
fs.Close();
}
}
}
///
/// 解压
///
/// 压缩包文件名
/// 解压缩目标路径
public static string UnZip(string zipFile, string targetPath)
{
var directoryName = targetPath;
if (!Directory.Exists(directoryName)) Directory.CreateDirectory(directoryName); //生成解压目录
var currentDirectory = directoryName;
var data = new byte[2048];
var size = 2048;
ZipEntry zipEntry = null;
var theEntry = string.Empty;
using var s = new ZipInputStream(File.OpenRead(zipFile));
while ((zipEntry = s.GetNextEntry()) != null)
{
if (zipEntry.IsDirectory)
{
// 该结点是目录
if (!Directory.Exists(currentDirectory + zipEntry.Name))
Directory.CreateDirectory(currentDirectory + zipEntry.Name);
//保存路径名
if (!string.IsNullOrEmpty(zipEntry.Name) && zipEntry.Name.Contains("/"))
theEntry = zipEntry.Name.Substring(0, zipEntry.Name.IndexOf('/'));
}
else
{
if (string.IsNullOrWhiteSpace(zipEntry.Name)) continue;
//解压文件到指定的目录
using var streamWriter = File.Create(currentDirectory + zipEntry.Name);
while (true)
{
size = s.Read(data, 0, data.Length);
if (size <= 0) break;
streamWriter.Write(data, 0, size);
}
streamWriter.Close();
}
}
s.Close();
return "/" + theEntry; //返回压缩文件的路径
}
}