using ICSharpCode.SharpZipLib.Zip;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace UpdateServiceLibrary.Helper
{
public class ZipHelper
{
///
/// 缓冲区大小
///
public static int ByteSize { get; set; } = 4096;
///
/// 压缩等级 0-9 越大压缩率越高
///
public static int ZipLevel { get; set; } = 6;
///
/// 解压压缩包到指定文件目录
///
///
///
///
///
public static ResultModel Unzip(FileInfo zipFile, DirectoryInfo unzipfolder, string password = null)
{
ResultModel resultModel = new ResultModel { IsSuccess = true };
try
{
//待解压文件是否存在
if (!zipFile.Exists)
throw new Exception("待解压文件不存在");
//创建解压目录
if (!unzipfolder.Exists)
unzipfolder.Create();
ZipEntry ent;
string fileName;
//打开文件流
using (var fs = zipFile.OpenRead())
{
//创建解压文件流
var zipStream = new ZipInputStream(fs);
if (password != null)
zipStream.Password = password;
//解压文件
while ((ent = zipStream.GetNextEntry()) != null)
{
if (string.IsNullOrEmpty(ent.Name))
continue;
fileName = Path.Combine(unzipfolder.FullName, ent.Name);
//判断是否为文件夹
if (ent.IsDirectory)
{
if (!Directory.Exists(fileName))
Directory.CreateDirectory(fileName);
continue;
}
var folder = Path.GetDirectoryName(fileName);
if (!Directory.Exists(folder))
Directory.CreateDirectory(folder);
//创建解压文件
int byteSize = ByteSize;
byte[] buff = new byte[byteSize];
using (var fw = File.Create(fileName))
{
while ((byteSize = zipStream.Read(buff, 0, buff.Length)) > 0)
{
fw.Write(buff, 0, byteSize);
}
}
}
}
}
catch(Exception ex)
{
resultModel.IsSuccess = false;
resultModel.Message = ex.Message;
}
return resultModel;
}
///
/// 压缩文件夹到指定文件
///
///
///
///
///
public static bool ZipFile(DirectoryInfo folder, FileInfo fileInfo, bool createRootFolder = false, string password = null)
{
//需要压缩的文件夹不存在时退出
if (!folder.Exists)
return false;
//创建并设定压缩流
using (ZipOutputStream zipOutputStream = new ZipOutputStream(fileInfo.Create()))
{
zipOutputStream.SetLevel(ZipLevel);
if (password != null)
zipOutputStream.Password = password;
//递归压缩文件夹
if (!ZipFile(folder, zipOutputStream, "", !createRootFolder))
return false;
//保存
zipOutputStream.Finish();
zipOutputStream.Close();
}
return true;
}
///
/// 递归压缩文件夹
///
///
///
///
///
private static bool ZipFile(DirectoryInfo folder, ZipOutputStream zipOutputStream, string parentFolderName, bool rootFolder = false)
{
try
{
//创建目录
ZipEntry ent;
if (!rootFolder)
{
ent = new ZipEntry(Path.Combine(parentFolderName, folder.Name + "/"));
zipOutputStream.PutNextEntry(ent);
zipOutputStream.Flush();
}
//初始化缓冲区
int byteSize = ByteSize;
byte[] buffer = new byte[byteSize];
//创建文件
foreach (var item in folder.GetFiles())
{
using (FileStream fs = item.OpenRead())
{
string entPath = string.Empty;
if (rootFolder)
entPath = Path.Combine(parentFolderName, item.Name);
else
entPath = Path.Combine(parentFolderName, folder.Name + "/" + item.Name);
ent = new ZipEntry(entPath);
ent.DateTime = DateTime.Now;
ent.Size = item.Length;
zipOutputStream.PutNextEntry(ent);
while ((byteSize = fs.Read(buffer, 0, buffer.Length)) > 0)
{
zipOutputStream.Write(buffer, 0, byteSize);
}
}
}
//递归压缩文件夹
if (!rootFolder)
parentFolderName = Path.Combine(parentFolderName, folder.Name);
foreach (var item in folder.GetDirectories())
{
if (!ZipFile(item, zipOutputStream, parentFolderName))
return false;
}
return true;
}
catch (Exception ex)
{
return false;
}
}
///
/// 压缩单个文件
///
///
///
///
///
public static bool ZipFile(FileInfo sourceFile, FileInfo targetFile, string password = null)
{
//需要压缩的文件不存在时退出
if (!sourceFile.Exists)
return false;
try
{
//创建压缩流
using (ZipOutputStream zipOutputStream = new ZipOutputStream(targetFile.Create()))
{
//设定压缩级别与密码
zipOutputStream.SetLevel(ZipLevel);
if (password != null)
zipOutputStream.Password = password;
//初始化缓冲区
int byteSize = ByteSize;
byte[] buffer = new byte[byteSize];
//初始化压缩实体
ZipEntry entry = new ZipEntry(sourceFile.Name);
entry.DateTime = DateTime.Now;
entry.Size = sourceFile.Length;
//压缩
zipOutputStream.PutNextEntry(entry);
using (var fs = sourceFile.OpenRead())
{
while ((byteSize = fs.Read(buffer, 0, buffer.Length)) > 0)
{
zipOutputStream.Write(buffer, 0, byteSize);
}
}
//保存关闭
zipOutputStream.Finish();
zipOutputStream.Close();
}
return true;
}
catch (Exception ex)
{
return false;
}
}
}
}