C#使用SharpZipLib对文件进行压缩和解压
使用SharpZipLib库
编写SharpZipLibHelper帮助类
csharp
using ICSharpCode.SharpZipLib.Zip;
namespace SharpZipLib_Project
{
public class SharpZipLibHelper
{
/// <summary>
/// 多个文件或文件夹压缩
/// </summary>
/// <param name="sourcePaths">文件或文件夹名称</param>
/// <param name="zipFilePath">压缩文件夹名称</param>
public static string CompressFilesAndDirectories(string[] sourcePaths, string zipFilePath)
{
try
{
using (FileStream fsOut = File.Create(zipFilePath))
{
using (ZipOutputStream zipStream = new ZipOutputStream(fsOut))
{
foreach (string sourcePath in sourcePaths)
{
if (Directory.Exists(sourcePath))
{
CompressDirectoryRecursive(sourcePath, zipStream);
}
else if (File.Exists(sourcePath))
{
CompressFile(sourcePath, zipStream);
}
else
{
Console.WriteLine($"Path '{sourcePath}' does not exist.");
}
}
}
}
return "成功";
}
catch (Exception ex)
{
return ex.Message;
}
}
/// <summary>
/// 向压缩文件添加文件
/// </summary>
/// <param name="sourceFilePath"></param>
/// <param name="zipStream"></param>
/// <returns></returns>
private static string CompressFile(string sourceFilePath, ZipOutputStream zipStream)
{
try
{
string entryName = Path.GetFileName(sourceFilePath);
ZipEntry newEntry = new ZipEntry(entryName);
zipStream.PutNextEntry(newEntry);
byte[] buffer = new byte[4096];
using (FileStream fsIn = File.OpenRead(sourceFilePath))
{
int sourceBytes;
do
{
sourceBytes = fsIn.Read(buffer, 0, buffer.Length);
zipStream.Write(buffer, 0, sourceBytes);
} while (sourceBytes > 0);
}
return "成功";
}
catch (Exception ex)
{
return ex.Message;
}
}
/// <summary>
/// 向压缩文件添加文件夹
/// </summary>
/// <param name="rootDirectoryPath"></param>
/// <param name="currentDirectoryPath"></param>
/// <param name="zipStream"></param>
/// <returns></returns>
private static string CompressDirectoryRecursive(string sourceDirectoryPath, ZipOutputStream zipStream)
{
try
{
string[] files = Directory.GetFiles(sourceDirectoryPath, "*", SearchOption.AllDirectories);
string rootDirectoryName = Path.GetFileName(sourceDirectoryPath);
// 添加文件夹本身
ZipEntry rootDirectoryEntry = new ZipEntry(rootDirectoryName + "/");
zipStream.PutNextEntry(rootDirectoryEntry);
// 添加文件夹内的文件和子文件夹
foreach (string file in files)
{
string relativePath = Path.GetRelativePath(sourceDirectoryPath, file);
ZipEntry newEntry = new ZipEntry(rootDirectoryName + "/" + relativePath);
zipStream.PutNextEntry(newEntry);
byte[] buffer = new byte[4096];
using (FileStream fsIn = File.OpenRead(file))
{
int sourceBytes;
while ((sourceBytes = fsIn.Read(buffer, 0, buffer.Length)) > 0)
{
zipStream.Write(buffer, 0, sourceBytes);
}
}
}
return "成功";
}
catch (Exception ex)
{
return ex.Message;
}
}
/// <summary>
/// 解压文件
/// </summary>
/// <param name="zipFilePath">压缩文件地址</param>
/// <param name="extractPath">解压文件夹</param>
/// <returns></returns>
public static string DecompressFile(string zipFilePath, string extractPath)
{
try
{
if (!Directory.Exists(extractPath))
Directory.CreateDirectory(extractPath);
using (FileStream fsIn = new FileStream(zipFilePath, FileMode.Open, FileAccess.Read))
{
using (ZipInputStream zipStream = new ZipInputStream(fsIn))
{
ZipEntry entry;
while ((entry = zipStream.GetNextEntry()) != null)
{
string entryFileName = Path.Combine(extractPath, entry.Name);
string directoryName = Path.GetDirectoryName(entryFileName);
if (directoryName.Length > 0 && !Directory.Exists(directoryName))
Directory.CreateDirectory(directoryName);
if (entry.IsFile)
{
using (FileStream fsOut = File.Create(entryFileName))
{
byte[] buffer = new byte[4096];
int sourceBytes;
while ((sourceBytes = zipStream.Read(buffer, 0, buffer.Length)) > 0)
{
fsOut.Write(buffer, 0, sourceBytes);
}
}
}
}
}
}
return "成功";
}
catch (Exception ex)
{
return ex.Message;
}
}
}
}
如何使用工具类
csharp
private void button1_Click(object sender, EventArgs e)
{
// 压缩文件
string[] sourcePaths = { "example.txt", "Example", "example1.txt"};
string str = SharpZipLibHelper.CompressFilesAndDirectories(sourcePaths, "example.zip");
if (str != "成功")
{
MessageBox.Show($"压缩失败: {str}");
}
else
{
MessageBox.Show("压缩成功!");
}
}
private void button2_Click(object sender, EventArgs e)
{
// 解压缩文件
string str = SharpZipLibHelper.DecompressFile("example.zip", "extracted_files");
if (str != "成功")
{
MessageBox.Show($"解压失败: {str}");
}
else
{
MessageBox.Show("解压成功!");
}
}
备注: 这种压缩方法无法压缩空的文件夹,因为空的文件夹里面没有文件路径,所有会自动忽略.如果需要添加空文件夹需要自己先判断目录是否为空,然后自己在压缩文件中创建就可以了
2024.3.13