C# 调用 rar 命令行

/// <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;
        }
    }
}

posted @   梦幻泡影  阅读(1097)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示