现在的位置: 首页 > 综合 > 正文

利用C#调用WINRAR实现压缩与解压

2013年10月11日 ⁄ 综合 ⁄ 共 8564字 ⁄ 字号 评论关闭

参考:http://hi.baidu.com/yandavid/blog/item/4f9bc80906b2998ad0581b5c.html

如果想扩展更多的东西,请参考RAR安装目录下 Rar.txt

限制
~~~~
    路径名长度小于 259 个字符。
    最大的压缩文件注释的长度是62000字节。
    命令限制:
    命令 'd','u','f','c','cf' 不能用于分卷压缩文件。
    命令 'a' 不能用来更新分卷压缩文件,只能用来创建。

返回值
~~~~~~
    RAR 成功操作后返回 0 。非 0 返回码意味着操作由于某种错误被取消:
     255   用户中断         用户中断操作
       9   创建错误         创建文件错误
       8   内存错误         没有足够的内存进行操作
       7   用户错误         命令行选项错误
       6   打开错误         打开文件错误
       5   写错误           写入磁盘错误
       4   被锁定压缩文件   试图修改先前使用 'k' 命令锁定的压缩文件
       3   CRC 错误         解压缩时发生一个 CRC 错误,当密码不对时返回3
       2   致命错误         发生一个致命错误
       1   警告             没有发生致命错误
       0   成功             操作成功

        protected void Button1_Click(object sender, EventArgs e)
        {
            string strtxtPath = "C://freezip//free.txt";
            string strzipPath = "C://freezip//free.zip";
            System.Diagnostics.Process Process1 = new System.Diagnostics.Process();
            Process1.StartInfo.FileName = "Winrar.exe";
            Process1.StartInfo.CreateNoWindow = true;
            Process1.StartInfo.Arguments = " a -r " + strzipPath + " " + strtxtPath;
            Process1.Start();
            Process1.WaitForExit();
            if (Process1.HasExited)
            {
                int iExitCode = Process1.ExitCode;
                if (iExitCode == 0)
                {
                    //正常完成
                }
                else
                {
                    //有错
                }
            }
            Process1.Close();
        }

public void RARsave(string patch,string rarPatch,string rarName)
         {
            String the_rar;
            RegistryKey the_Reg;
            Object the_Obj;
            String the_Info;
            ProcessStartInfo the_StartInfo;
            Process the_Process;
            try
             {
                 the_Reg = Registry.ClassesRoot.OpenSubKey(@"ApplicationsWinRAR.exeShellOpenCommand");
                 the_Obj = the_Reg.GetValue("");
                 the_rar = the_Obj.ToString();
                 the_Reg.Close();
                 the_rar = the_rar.Substring(1, the_rar.Length - 7);
                Directory.CreateDirectory(patch);
                
//命令参数

                
//the_Info = " a " + rarName + " " + @"C:Test?70821.txt"; //文件压缩

                 the_Info = " a " + rarName + " " + patch + " -r"; ;
                 the_StartInfo = new ProcessStartInfo();
                 the_StartInfo.FileName = the_rar;
                 the_StartInfo.Arguments = the_Info;
                 the_StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                
//打包文件存放目录

                 the_StartInfo.WorkingDirectory = rarPatch;
                 the_Process = new Process();
                 the_Process.StartInfo = the_StartInfo;
                 the_Process.Start();
                 the_Process.WaitForExit();
                 the_Process.Close();
            }
            catch (Exception ex)
             {
                throw ex;
            }
        }
    public string unRAR(string unRarPatch,string rarPatch,string rarName)
     {
        String the_rar;
        RegistryKey the_Reg;
        Object the_Obj;
        String the_Info;
        ProcessStartInfo the_StartInfo;
        Process the_Process;
        try
         {
             the_Reg = Registry.ClassesRoot.OpenSubKey(@"ApplicationsWinRAR.exeShellOpenCommand");
             the_Obj = the_Reg.GetValue("");
             the_rar = the_Obj.ToString();
             the_Reg.Close();
             the_rar = the_rar.Substring(1, the_rar.Length - 7);
            Directory.CreateDirectory(Server.MapPath(unRarPatch));
             the_Info = "e " + rarName + " " + Server.MapPath(unRarPatch) + " -y";
             the_StartInfo = new ProcessStartInfo();
             the_StartInfo.FileName = the_rar;
             the_StartInfo.Arguments = the_Info;
             the_StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
             the_StartInfo.WorkingDirectory = Server.MapPath(rarPatch);
//获取压缩包路径

             the_Process = new Process();
             the_Process.StartInfo = the_StartInfo;
             the_Process.Start();
             the_Process.WaitForExit();
             the_Process.Close();
        }
        catch (Exception ex)
         {
            throw ex;
        }
        return Server.MapPath(unRarPatch);
    }

更多WinRAR命令(引自WinRAR帮助文档)
a 添加文件到压缩文件
c 添加压缩文件注释
d 从压缩文件删除文件
e 从压缩文件解压压缩,忽略路径
f 刷新压缩文件中的文件
i 在压缩文件中查找字符串
k 锁定压缩文件
m 移动文件和文件夹到压缩文件
r 修复受损的压缩文件
rc 重建丢失的卷
rn 重命名压缩文件
rr[N] 添加数据恢复记录
rv[N] 创建恢复卷
s[name] 转换压缩文件成为自解压文件类型
s- 删除自解压模块
t 测试压缩文件
u 从压缩文件中更新文件
x 以完整路径名称从压缩文件解压压缩  

更多WinRAR字母开头(引自WinRAR帮助文档)
-ac 在压缩或解压后清除存档属性
-ad 附加压缩文件名到目标路径中
-af<类型> 指定压缩文件格式
-ag[格式] 以当前日期生成压缩文件名
-ao 添加有存档属性设置的
-ap 设置内部压缩文件路径
-as 同步化压缩文件内容
-av 应用用户身份校验信息
-av- 禁用添加用户身份校验信息
-cfg- 忽略默认配置和环境变量
-cl 将文件名转换成为小写
-cu 将文件名转换成为大写
-df 压缩后删除压缩文件
-dh 打开共享的文件
-ds 不排序压缩的文件
-ed 不添加空文件夹
-en 不添加“压缩文件结束”块
-ep 从名称中排除路径
-ep1 从名称中排除主文件夹
-ep2 扩大成完整路径
-ep3 扩展包含盘符的完整路径
-e[+]<属性> 设置文件排除和包含属性
-f 刷新文件
-hp[密码] 加密文件数据和头
-ibck 在后台运行 WinRAR
-ieml 使用E-mail发送压缩文件
-iicon<名称> 指定自解压图标
-iimg<名称> 指定自解压图片
-ilog[名称] 记录错误到文件中
-inul 关闭错误信息
-ioff 关闭 PC 电源
-k 锁定压缩文件
-kb 保留坏掉的解压文件
-m<n> 设置压缩方式
-mc<参数> 设置高级压缩参数
-md<n> 选择字典大小
-ms 指定文件存储
-n<文件> 仅包含指定的文件
-n@<列表文件> 使用指定的列表文件包含文件
-os 保存 NTFS 数据流
-oc 设置 NTFS “压缩”属性
-ow 处理文件用户身份校验信息
-o+ 覆盖已存在的文件
-o- 不要覆盖已存在的文件
-p[密码] 设置密码
-r 返回子文件夹
-r0 只返回与通配符匹配的子文件夹
-ri 设置优先级和休眠时间
-rr[N] 添加数据恢复记录
-rv[N] 创建恢复卷
-s 创建固实压缩文件
-s<N> 以文件数量创建固实组
-se 以文件扩展名创建固实组
-sfx[名称] 创建自解压文件
-sv 创建互不依赖的固实压缩文件
-sv- 创建互相依赖的固实压缩文件
-s- 禁用固实算法
-t 压缩后测试文件
-ta<日期> 只处理指定日期之后修改的文件
-tb<日期> 只处理指定日期之前修改的文件
-tk 保持原有压缩文件时间
-tl 以最新的文件设置压缩文件时间
-tn<时间> 处理较新于指定时间的文件
-to<时间> 处理较旧于指定时间的文件
-ts<m,c,a> 保存或恢复文件时间(修改,创建,访问)
-u 更新文件
-v<n>[k|b|f|m|M|g|G] 创建分卷压缩
-vd 创建分卷压缩前清除磁盘内容
-ver 文件版本控制
-vn 使用旧风格的卷命名法则
-vp 每次分卷压缩前暂停
-x<文件> 排除指定的文件
-x@<文件列表> 使用指定的列表文件来排除指定的文件
-y 假设全部的询问回应皆为“是”
-z<文件> 从文件读取压缩文件注释
-- 停止开关的扫描

RAR参数:

一、压缩命令
1、将temp.txt压缩为temp.rarrar a temp.rar temp.txt
2、将当前目录下所有文件压缩到temp.rarrar a temp.rar *.*
3、将当前目录下所有文件及其所有子目录压缩到temp.rarrar a temp.rar *.* -r
4、将当前目录下所有文件及其所有子目录压缩到temp.rar,并加上密码123rar a temp.rar *.* -r -p123

二、解压命令
1、将temp.rar解压到c:/temp目录rar e temp.rar c:/temprar e *.rar c:/temp(支持批量操作)
2、将temp.rar解压到c:/temp目录,并且解压后的目录结构和temp.rar中的目录结构一

压缩目录test及其子目录的文件内容
Wzzip test.zip test -r -P
WINRAR A test.rar test -r

删除压缩包中的*.txt文件
Wzzip test.zip *.txt -d
WinRAR d test.rar *.txt

刷新压缩包中的文件,即添加已经存在于压缩包中但更新的文件
Wzzip test.zip test -f
Winrar f test.rar test

更新压缩包中的文件,即添加已经存在于压缩包中但更新的文件以及新文件
Wzzip test.zip test -u
Winrar u test.rar test

移动文件到压缩包,即添加文件到压缩包后再删除被压缩的文件
Wzzip test.zip -r -P -m
Winrar m test.rar test -r

添加全部 *.exe 文件到压缩文件,但排除有 a或b
开头名称的文件
Wzzip test *.exe -xf*.* -xb*.*
WinRAR a test *.exe -xf*.* -xb*.*

加密码进行压缩
Wzzip test.zip test
-s123。注意密码是大小写敏感的。在图形界面下打开带密码的压缩文件,会看到+号标记(附图1)。
WINRAR A test.rar test -p123
-r。注意密码是大小写敏感的。在图形界面下打开带密码的压缩文件,会看到*号标记(附图2)。

按名字排序、以简要方式列表显示压缩包文件
Wzzip test.zip -vbn
Rar l test.rar

锁定压缩包,即防止未来对压缩包的任何修改
无对应命令
Winrar k test.rar

创建360kb大小的分卷压缩包
无对应命令
Winrar a -v360 test

带子目录信息解压缩文件
Wzunzip test -d
Winrar x test -r

不带子目录信息解压缩文件
Wzunzip test
Winrar e test

解压缩文件到指定目录,如果目录不存在,自动创建
Wzunzip test newfolder
Winrar x test newfolder

解压缩文件并确认覆盖文件
Wzunzip test -y
Winrar x test -y

解压缩特定文件
Wzunzip test *.txt
Winrar x test *.txt

解压缩现有文件的更新文件
Wzunzip test -f
Winrar x test -f

解压缩现有文件的更新文件及新文件
Wzunzip test -n
Winrar x test -u

批量解压缩文件
Wzunzip *.zip
WinRAR e *.rar

我的UnRAR:

        /// <summary>
        /// 使用WinRAR解压缩文件
        /// </summary>
        /// <param name="path">解压文件存储的路径</param>
        /// <param name="rarFullName">压缩文件的完整地址</param>
        /// <param name="pwd">压缩文件的密码</param>
        /// <returns>解压完成返回true,否则返回false</returns>
        public int UnRAR(string path, string rarFullName,string pwd)
        {
            string rarName = rarFullName.Split('//')[rarFullName.Split('//').Length - 1];
            string rarPath = rarFullName.Remove(rarFullName.LastIndexOf(rarName) - 1);

            int iExitCode=2;
            string rarexe;
            RegistryKey regkey;
            Object regvalue;
            string cmd;
            ProcessStartInfo startinfo;
            Process process;
            try
            {
                regkey = Registry.ClassesRoot.OpenSubKey(@"Applications/WinRAR.exe/shell/open/command");
                regvalue = regkey.GetValue("");
                rarexe = regvalue.ToString();
                regkey.Close();
                rarexe = rarexe.Substring(1, rarexe.Length - 7);

                Directory.CreateDirectory(path);
                //解压缩命令,相当于在要压缩文件(rarName)上点右键->WinRAR->解压文件->目标路径(path)
                cmd = string.Format("x {0} {1} -y -p{2}",
                                    rarName,
                                    path,pwd);

                startinfo = new ProcessStartInfo();
                startinfo.FileName = rarexe;
                startinfo.Arguments = cmd;
                // startinfo.Verb = "open";
                //startinfo.WindowStyle = ProcessWindowStyle.Hidden;
                startinfo.WorkingDirectory = rarPath;

                process = new Process();
                process.StartInfo = startinfo;
                process.Start();
                process.WaitForExit();
                if (process.HasExited)
                {
                    iExitCode = process.ExitCode;

                }
                process.Close();
            }
            catch (Exception e)
            {
                throw e;
            }
            return iExitCode;
        }

抱歉!评论已关闭.