C# 调用WinRAR解压缩文件

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

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
    }
View Code

具体的命令可以参考winrar的帮助文档

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

猜你喜欢

转载自www.cnblogs.com/ZJ199012/p/11909760.html