C# 调用WinRar执行rar、zip压缩

先来简单说说压缩文件的好处,既然要用到那还是知道点好。

1、节约硬盘资源,方便管理

      下面的代码所执行的压缩是存储压缩,

      对于文件的大小控制的不是那么严格,

      但是对于节约硬盘资源的原理是从磁盘的扇区角度上来说的。

2、便于传输

      大家都知道用QQ或其他工具传输资源时,

      压缩文件明显要快些。

      由于文件太散程序也比较累。

      其原理也是因为磁盘寻道要话时间

    (这里提醒下广大市民如果有时间还是整理下磁盘碎片吧。)

上面都是废话,这里才是正题。

/// <summary>
/// 验证WinRar是否安装。
/// </summary>
/// <returns>true:已安装,false:未安装</returns>
private static bool ExistsRar(out String winRarPath)
{
    winRarPath = String.Empty;

    //通过Regedit(注册表)找到WinRar文件 
    var path = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe";
    var registryKey = Registry.LocalMachine.OpenSubKey(path);

    if (registryKey == null) return false;//未安装

    //registryKey = theReg;可以直接返回Registry对象供会面操作
    winRarPath = registryKey.GetValue("").ToString();//这里为节约资源,直接返回路径,反正下面也没用到

    registryKey.Close();//关闭注册表

    return !String.IsNullOrEmpty(winRarPath);
}

该方法不要用于判断用户是否安装WinRar,

以判断是否继续执行一下代码

/// <summary>
/// 生成Zip
/// </summary>
/// <param name="path">文件夹路径</param>
/// <param name="rarPath">生成压缩文件的路径</param>
/// <param name="rarName">生成压缩文件的文件名</param>
public static void CompressRar(String path, String rarPath, String rarName)
{
    try
    {
        String winRarPath = null;
        if (!ExistsRar(out winRarPath)) return;//验证WinRar是否安装。

        var pathInfo = String.Format("a -afzip -m0 -ep1 \"{0}\" \"{1}\"", rarName, path);

        #region WinRar 用到的命令注释

        //[a] 添加到压缩文件
        //afzip 执行zip压缩方式,方便用户在不同环境下使用。(取消该参数则执行rar压缩)
        //-m0 存储 添加到压缩文件时不压缩文件。共6个级别【0-5】,值越大效果越好,也越慢
        //ep1 依名称排除主目录(生成的压缩文件不会出现不必要的层级)
        //r   修复压缩档案
        //t   测试压缩档案内的文件 
        //as  同步压缩档案内容  
        //-p  给压缩文件加密码方式为:-p123456

        #endregion

        //打包文件存放目录
        var process = new Process
        {
            StartInfo = new ProcessStartInfo
            {
                FileName = winRarPath,//执行的文件名
                Arguments = pathInfo,//需要执行的命令
                UseShellExecute = false,//使用Shell执行
                WindowStyle = ProcessWindowStyle.Hidden,//隐藏窗体
                WorkingDirectory = rarPath,//rar 存放位置
                CreateNoWindow = false,//不显示窗体
            },
        };
        process.Start();//开始执行
        process.WaitForExit();//等待完成并退出
        process.Close();//关闭调用 cmd 的什么什么
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

配合上面方法成功完成zip压缩。

本来还想加是上一个添加注释的功能,

但是在网上找到的都是通过文件添加注释,这种方式不是我想要的。

由于时间关系暂时放下了。

下面再贴一个解压的方法,由于现在还没有用到解压的功能,

所以以下方法还未经测试。

/// <summary>
/// 解压
/// </summary>
/// <param name="unRarPath">文件夹路径</param>
/// <param name="rarPath">压缩文件的路径</param>
/// <param name="rarName">压缩文件的文件名</param>
/// <returns></returns>
public static String UnCompressRar(String unRarPath, String rarPath, String rarName)
{
    try
    {
        String winRarPath = null;
        if (!ExistsRar(out winRarPath)) return "";//验证WinRar是否安装。

        if (Directory.Exists(unRarPath) == false)
        {
            Directory.CreateDirectory(unRarPath);
        }

        var pathInfo = "x " + rarName + " " + unRarPath + " -y";

        var process = new Process
        {
            StartInfo = new ProcessStartInfo
            {
                FileName = winRarPath,//执行的文件名
                Arguments = pathInfo,//需要执行的命令
                UseShellExecute = false,//使用Shell执行
                WindowStyle = ProcessWindowStyle.Hidden,//隐藏窗体
                WorkingDirectory = rarPath,//rar 存放位置
                CreateNoWindow = false,//不显示窗体
            },
        };
        process.Start();//开始执行
        process.WaitForExit();//等待完成并退出
        process.Close();//关闭调用 cmd 的什么什么
    }
    catch (Exception ex)
    {
        throw ex;
    }
    return unRarPath;
}

最后补充点,如果安装了WinRAR而又不能调用成功,

试试将安装目录下的:Rar.exe 文件复制到 System32 下。

以上代码都是通过网上的资源整合而来,并非原创

原文地址:https://www.cnblogs.com/fxck/p/13076981.html