在项目中有可能会用到解压缩,代码如下

public class CompressHelper
{
/// <summary>
/// 压缩
/// </summary>
/// <param name="sourceFilePath">源文件路径</param>
/// <param name="sourceName">源文件名称</param>
/// <param name="compressName">压缩文件名</param>
/// <param name="compressPath">压缩文件路径</param>
/// <returns></returns>
public static bool CompressFile(string sourceFilePath, string sourceName, string compressName, string compressPath)
{
string winrarPath = string.Empty;
if (!ExistsCompressApp(out winrarPath))
{
return false;
}
if (string.IsNullOrEmpty(compressPath))
{
compressPath = sourceFilePath;
}
string type = compressName.Substring(compressName.IndexOf('.') + 1);
string compressType = string.Empty;
if (type.ToUpper() == CompressType.RAR.ToString())
{
compressType = "-af" + CompressType.RAR.ToString().ToLower();
}
else if (type.ToUpper() == CompressType.ZIP.ToString())
{
compressType = "-af" + CompressType.ZIP.ToString().ToLower();
}
else
{
compressType = "-af" + CompressType.RAR.ToString().ToLower();
compressName = compressName + "." + CompressType.RAR.ToString().ToLower();
}
CreateFolder(compressPath);
/**
* <命令> -<开关1> -<开关N> <压缩文件 > <文件...> <@列表文件...> <解压路径\>
* 压缩 a a -ep -o+ -df d:\test.rar d:\test.jpg
* 压缩 -ep(排除文件名的路径) -o+(覆盖全部文件 (更新压缩文件时的默认值))
* -df(压缩后删除源文件)-afrar(-AF<类型> - 指定压缩文件格式)
* */
string cmd = string.Format(@" a -ep -o+ {2} -df {0} {1}", Path.Combine(compressPath, compressName), Path.Combine(sourceFilePath, sourceName), compressType);
return StartProcess(winrarPath, cmd);
}
/// <summary>
/// 解压
/// </summary>
/// <param name="unCompressPath">解压文件路径</param>
/// <param name="unCompressName">解压文件名</param>
/// <param name="filePath">解压后文件路径</param>
/// <returns></returns>
public static bool UnCompressFile(string unCompressPath, string unCompressName, string filePath)
{
string winrarPath = string.Empty;
if (!ExistsCompressApp(out winrarPath))
{
return false;
}
if (string.IsNullOrEmpty(filePath))
{
filePath = unCompressPath;
}
CreateFolder(filePath);
/**
* <命令> -<开关1> -<开关N> <压缩文件 > <文件...> <@列表文件...> <解压路径\>
* 解压 x x -ibck -inul -y -mt5 d:\test.rar d:\test
* 解压 -ibck(在后台执行 WinRAR) -inul(禁用错误信息) -y(所有问题的默认值为“是”)
* -mt5(设置线程数量)
* */
string cmd = string.Format(@" x -ibck -inul -y -mt5 {0} {1}", Path.Combine(unCompressPath, unCompressName), filePath);
return StartProcess(winrarPath, cmd);
}
/// <summary>
/// 判断是否安装了压缩软件
/// </summary>
/// <param name="winrarPath">软件安装路径</param>
/// <returns></returns>
private static bool ExistsCompressApp(out string winrarPath)
{
winrarPath = string.Empty;
//通过注册表找到WinRAR软件
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe");
if (key == null)
return false;
winrarPath = key.GetValue("").ToString();//获取winrar软件安装路径
key.Close(); //关闭注册表
return !string.IsNullOrEmpty(winrarPath);
}
/// <summary>
/// 执行压缩操作
/// </summary>
/// <param name="exePath">WinRAR路径</param>
/// <param name="exeArg">WinRAR参数</param>
/// <param name="isHide">是否显示窗体</param>
/// <returns></returns>
private static bool StartProcess(string exePath, string exeArg, bool isHide = false)
{
Process p = new Process();
p.StartInfo.FileName = exePath;
p.StartInfo.Arguments = exeArg;
if (isHide)
{
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo.CreateNoWindow = true;
}
else
{
p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
p.StartInfo.CreateNoWindow = false;
}
p.Start();
int idx = 1;
while (!p.HasExited)
{
idx++;
p.WaitForExit(1000);
if (idx == 50)
{
p.Kill();
return false;
}
}
p.Close();
p.Dispose();
return true;
}
/// <summary>
/// 判断文件夹是否存在
/// </summary>
/// <param name="path">路径</param>
private static void CreateFolder(string path)
{
if (!File.Exists(path))
{
Directory.CreateDirectory(path);
}
}
}
/// <summary>
/// 压缩类型
/// </summary>
public enum CompressType
{
RAR,
ZIP
}
具体的命令可以参考winrar的帮助文档

参考 https://www.cnblogs.com/zhoub/p/3841276.html
