Files
DevToolsAvalonia/常用工具集/Utility/Core/ZipHelper.cs
2025-08-26 08:37:44 +08:00

216 lines
7.5 KiB
C#

using ICSharpCode.SharpZipLib.Zip;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
namespace MES.Utility.Core
{
public static class ZipHelper
{
/// <summary>
/// 压缩
/// </summary>
/// <param name="filename"> 压缩后的文件名(包含物理路径)</param>
/// <param name="directory">待压缩的文件夹(包含物理路径)</param>
//public static void PackFiles(string filename, string directory)
//{
// try
// {
// FastZip fz = new FastZip();
// fz.CreateEmptyDirectories = true;
// fz.CreateZip(filename, directory, true, "");
// fz = null;
// }
// catch (Exception)
// {
// throw;
// }
//}
/// <summary>
/// 判断是文件夹还是文件
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
private static bool IsDir(string filePath)
{
FileInfo fi = new FileInfo(filePath);
if ((fi.Attributes & FileAttributes.Directory) != 0)
return true;
return false;
}
/// <summary>
/// 压缩
/// </summary>
/// <param name="fileName">压缩后的文件名(包含物理路径)</param>
/// <param name="fileOrDirectoryPath">动长参数,待压缩的文件或者文件夹</param>
/// <returns></returns>
public static bool PackFiles(string fileName, params string[] fileOrDirectoryPath)
{
try
{
ZipStrings.UseUnicode = true;
using (ZipOutputStream zipStream = new ZipOutputStream(File.Create(fileName)))
{
zipStream.SetComment("版本1.0");
zipStream.SetLevel(6);//设值CompressionLevel,压缩比
foreach (string filePath in fileOrDirectoryPath)
{
ZipMultiFiles(filePath, zipStream);
}
}
return true;
}
catch
{
return false;
}
}
/// <summary>
/// 加密压缩
/// </summary>
/// <param name="fileName">压缩后的文件名(包含物理路径)</param>
/// <param name="password">密码</param>
/// <param name="fileOrDirectoryPath">动长参数,待压缩的文件或者文件夹</param>
/// <returns></returns>
public static bool PackFilesWithPassword(string fileName, string password, params string[] fileOrDirectoryPath)
{
try
{
ZipStrings.UseUnicode = true;
using (ZipOutputStream zipStream = new ZipOutputStream(File.Create(fileName)))
{
zipStream.SetComment("版本1.0");
zipStream.SetLevel(6);//设值CompressionLevel,压缩比
if (!password.IsNullOrEmpty())
{
zipStream.Password = password;
}
foreach (string filePath in fileOrDirectoryPath)
{
ZipMultiFiles(filePath, zipStream);
}
}
return true;
}
catch
{
return false;
}
}
private static void ZipMultiFiles(string file, ZipOutputStream zipStream, string lastName = "")
{
file = file.Replace("\\", "/");
if (!IsDir(file))
{
if (!File.Exists(file))
{
throw new Exception($"文件{file}不存在");
}
using (FileStream streamReader = File.OpenRead(file))
{
string path = Path.GetFileName(file);
if (lastName != "")
{
path = lastName + "/" + path;
}
ZipEntry zipEntry = new ZipEntry(path);
zipEntry.DateTime = DateTime.Now;
zipEntry.Size = streamReader.Length;
zipStream.PutNextEntry(zipEntry);//压入文件
int sourceCount = 0;
byte[] buffer = new byte[4096 * 1024];
while ((sourceCount = streamReader.Read(buffer, 0, buffer.Length)) > 0)
{
zipStream.Write(buffer, 0, sourceCount);
}
}
}
else
{
if (!Directory.Exists(file))
{
throw new Exception($"文件夹{file}不存在");
}
string[] fileArray = Directory.GetFileSystemEntries(file);
string folderName = new DirectoryInfo(file).Name; //Regex.Match(file, @"[^\/:*\?\”“\<>|,\\]*$").ToString();
if (lastName != "")
{
folderName = lastName + "/" + folderName;
}
if (fileArray.Length == 0)
{
ZipEntry zipEntry = new ZipEntry(folderName + "/");
zipStream.PutNextEntry(zipEntry);
}
foreach (string f in fileArray)
{
ZipMultiFiles(f, zipStream, folderName);
}
}
}
/// <summary>
/// 解压缩
/// </summary>
/// <param name="file">待解压文件名(包含物理路径)</param>
/// <param name="dir"> 解压到哪个目录中(包含物理路径)</param>
public static bool UnpackFiles(string file, string dir)
{
try
{
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
ZipInputStream s = new ZipInputStream(File.OpenRead(file));
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(theEntry.Name);
string fileName = Path.GetFileName(theEntry.Name);
if (directoryName != String.Empty)
{
Directory.CreateDirectory(dir + directoryName);
}
if (fileName != String.Empty)
{
FileStream streamWriter = File.Create(dir + theEntry.Name);
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}
streamWriter.Close();
}
}
s.Close();
return true;
}
catch (Exception)
{
throw;
}
}
}
}