/// <summary>
/// Rar 是调用 rar 命令行的工具。
/// </summary>
public class Rar
{
/// <summary>
///
/// </summary>
/// <param name="rarCommandPath">rar命令行工具在路径,例如:"C:\Program Files\WinRAR\rar.exe"</param>
public Rar(string rarCommandPath)
{
this._RarCommandPath = rarCommandPath;
}
/// <summary>
/// 创建此类的实例,使用 "C:\Program Files\WinRAR\rar.exe" 作为 rarCommandPath 的值
/// </summary>
public Rar()
: this(Rar.Default_RAR_Command_Path)
{
}
/// <summary>
/// 从一个 rar 文件中解压
/// </summary>
/// <param name="rarFile">要解压的 rar 文件,绝对路径</param>
/// <param name="path">指定将文件解压到哪个目录,绝对路径,末尾有无 \ 均可</param>
/// <returns>一共解压了几个文件</returns>
public virtual string Extract(string rarFile, string path)
{
// 使用类似这个的 rar 命令: rar x test.rar "c:\test\" 路径后必须有 \
// 调用 rar 命令
if (path.EndsWith(@"\") == false)
{
path += @"\";
}
string args = string.Format(@" x ""{0}"" ""{1}""", rarFile, path);
ProcessStartInfo psi = new ProcessStartInfo(RarCommandPath, args);
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.CreateNoWindow = true;
Process p = Process.Start(psi);
//// 捕获输出
string ret = p.StandardOutput.ReadToEnd();
p.WaitForExit();
return ret;
}
/// <summary>
/// 创建一个 rar 文件,并将指定的文件添加到其中
/// </summary>
/// <param name="rarFile">要创建的 rar 文件,应为相对于 baseDir 的路径</param>
/// <param name="files">要添加到 rar 文件的一组文件,应为相对于 baseDir 的路径</param>
/// <param name="baseDir">基目录,在此方法工作过程,当前目录会被设为基目录,方法结束前,将当前目录还原</param>
/// <returns></returns>
public virtual string Add(string rarFile, string[] files, string baseDir)
{
// 使用类似这个的 rar 命令: rar a test.rar @list.txt
// 设置当前目录
string origCurDir = Environment.CurrentDirectory;
Environment.CurrentDirectory = baseDir;
// 创建临时文件,将 files 参数写入其中,
string listFilePath = @"list.txt";
using (StreamWriter sw = new StreamWriter(listFilePath, false, Encoding.Default))
{
for (int i = 0; i < files.Length; i++)
{
sw.WriteLine(files[i]);
}
}
// 调用 rar 命令
string args = string.Format(@" a ""{0}"" ""@{1}""", rarFile, listFilePath);
ProcessStartInfo psi = new ProcessStartInfo(RarCommandPath, args);
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.CreateNoWindow = true;
Process p = Process.Start(psi);
//// 捕获输出
string ret = p.StandardOutput.ReadToEnd();
p.WaitForExit();
// 删除列表 list.txt
File.Delete(listFilePath);
// 还原当前目录
Environment.CurrentDirectory = origCurDir;
return ret;
}
/// <summary>
/// 获取 rar 命令行工具的路径,例如:"C:\Program Files\WinRAR\rar.exe"
/// </summary>
public string RarCommandPath
{
get
{
return _RarCommandPath;
}
}
private string _RarCommandPath;
/// <summary>
/// 默认的 rar 命令行位置,值为 @"C:\Program Files\WinRAR\rar.exe"
/// </summary>
public const string Default_RAR_Command_Path = @"C:\Program Files\WinRAR\rar.exe";
/// <summary>
/// 测试一个文件是否是压缩包。
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public bool TestFile(string path)
{
// 使用类似这个的 rar 命令: rar t "path"
// 调用 rar 命令
string args = string.Format(@" t ""{0}""", path);
ProcessStartInfo psi = new ProcessStartInfo(RarCommandPath, args);
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.CreateNoWindow = true;
Process p = Process.Start(psi);
//// 捕获输出
string ret = p.StandardOutput.ReadToEnd();
p.WaitForExit();
if (ret.ToLower().Trim().EndsWith("ok"))
{
return true;
}
else
{
return false;
}
}
}