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