网上有很多压缩和解压的第三方类库,下面代码是使用C#自带类库实现的文件压缩解压。
注意在用c#自带的类库实现文件压缩和解压的时候需要添加下面的引用:
using System.IO;using System.IO.Compression;
System.IO.Compression.FileSystem;
自己封装的帮助类:
public class ZipHelper
{
/// <summary>
/// 压缩单文件
/// </summary>
/// <param name="filePath">文件路径</param>
/// <param name="savePath">压缩包路径</param>
/// <param name="isReserved">是否保存原文件</param>
public static void CompressSingleFile(string filePath, string savePath, bool isReserved = true)
{
if (!File.Exists(filePath))
{
throw new FileNotFoundException($"{filePath}不存在.");
}
FileInfo file = new FileInfo(filePath);
string filename = Path.GetFileNameWithoutExtension(filePath);
string tempDir = Path.Combine(file.DirectoryName, "temp_Zip");
if (!File.Exists(tempDir))
{
Directory.CreateDirectory(tempDir);
}
//默认保留原文件
if (isReserved)
{
file.CopyTo(Path.Combine(tempDir, file.Name));
}
else
{
file.MoveTo(Path.Combine(tempDir, file.Name));
}
ZipFile.CreateFromDirectory(tempDir, savePath);
DeleteDir(tempDir);
}
/// <summary>
/// 压缩文件夹
/// </summary>
/// <param name="dirPath">文件夹路径</param>
/// <param name="savePath">压缩包路径</param>
/// <param name="isReserved">是否保存原文件</param>
public static void CompressSingleDir(string dirPath, string savePath, bool isReserved = true)
{
ZipFile.CreateFromDirectory(dirPath, savePath);
if (!isReserved)
{
DeleteDir(dirPath);
}
}
/// <summary>
/// 多文件压缩
/// </summary>
/// <param name="filePaths">文件夹路径数组</param>
/// <param name="savePath">压缩包路径</param>
/// <param name="isReserved">是否保存原文件</param>
public static void CompressMultiFile(string[] filePaths, string savePath, bool isReserved = true)
{
string tempDir = Path.Combine(Path.GetDirectoryName(savePath), "temp_Zip");
if (!File.Exists(tempDir))
{
Directory.CreateDirectory(tempDir);
}
foreach (string filePath in filePaths)
{
if (!File.Exists(filePath))
{
throw new FileNotFoundException($"{filePath}不存在.");
}
FileInfo file = new FileInfo(filePath);
string filename = Path.GetFileNameWithoutExtension(filePath);
//默认保留原文件
if (isReserved)
{
file.CopyTo(Path.Combine(tempDir, file.Name));
}
else
{
file.MoveTo(Path.Combine(tempDir, file.Name));
}
}
ZipFile.CreateFromDirectory(tempDir, savePath);
DeleteDir(tempDir);
}
/// <summary>
/// 文件解压
/// </summary>
/// <param name="zipPath">压缩包路径</param>
/// <param name="saveDir">解压保存文件夹</param>
/// <param name="isReserved">是否保存压缩包</param>
public static void DeCompressMulti(string zipPath, string saveDir, bool isReserved = true)
{
ZipFile.ExtractToDirectory(zipPath, saveDir);
if(!isReserved)
{
File.Delete(zipPath);
}
}
/// <summary>
/// 删除文件夹及文件夹下文件
/// </summary>
/// <param name="dirPath">文件夹路径</param>
private static void DeleteDir(string dirPath)
{
//去除文件夹和子文件的只读属性
//去除文件夹的只读属性
DirectoryInfo fileInfo = new DirectoryInfo(dirPath);
fileInfo.Attributes = FileAttributes.Normal & FileAttributes.Directory;
//去除文件的只读属性
File.SetAttributes(dirPath, FileAttributes.Normal);
//判断文件夹是否还存在
if (Directory.Exists(dirPath))
{
foreach (string file in Directory.GetFileSystemEntries(dirPath))
{
if (File.Exists(file))
{
//如果有子文件删除文件
File.Delete(file);
}
else
{
//循环递归删除子文件夹
DeleteDir(file);
}
}
//删除空文件夹
Directory.Delete(dirPath);
}
}
}
调用方式:
static void Main(string[] args)
{
string[] arr = new string[3] { @"D:\Projects\Test\Data\1.txt", @"D:\Projects\Test\Data\2.txt", @"D:\Projects\Test\Data\3.txt" };
ZipHelper.CompressSingleFile(@"D:\Projects\Test\Data\1.txt", @"D:\Projects\Test\Data\1.zip", false);
ZipHelper.CompressSingleDir(@"D:\Projects\Test\Data", @"D:\Projects\Test\Data.zip");
ZipHelper.CompressMultiFile(arr, @"D:\Projects\Test\Data.zip",false);
ZipHelper.DeCompressMulti(@"D:\Projects\Test", @"D:\Projects\Test\Data.zip");
}