[转] C# 利用WinRAR (加密)压缩及解压缩 相关参数

来源:互联网 发布:java实训项目 编辑:程序博客网 时间:2024/05/28 11:29

本次示例主要实现:
1.压缩文件夹及其下文件
2.压缩文件夹下文件
3.压缩文件夹及其下文件为rar 还是 zip
4.解压缩
5.加密压缩及解加密压缩
-----------
示例代码如下:
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;

        //// 1
        ////压缩c:\freezip\free.txt(即文件夹及其下文件freezip\free.txt)
        ////到c:\freezip\free.rar
        //strzipPath = "C:\\freezip\\free";//默认压缩方式为 .rar
        //Process1.StartInfo.Arguments = " a -r " + strzipPath + " " + strtxtPath;

        //// 2
        ////压缩c:\freezip\free.txt(即文件夹及其下文件freezip\free.txt)
        ////到c:\freezip\free.rar
        //strzipPath = "C:\\freezip\\free";//设置压缩方式为 .zip
        //Process1.StartInfo.Arguments = " a -afzip " + strzipPath + " " + strtxtPath;

        //// 3
        ////压缩c:\freezip\free.txt(即文件夹及其下文件freezip\free.txt)
        ////到c:\freezip\free.zip 直接设定为free.zip
        //Process1.StartInfo.Arguments = " a -r "+strzipPath+" " + strtxtPath ;

        //// 4
        ////搬迁压缩c:\freezip\free.txt(即文件夹及其下文件freezip\free.txt)
        ////到c:\freezip\free.rar 压缩后 原文件将不存在
        //Process1.StartInfo.Arguments = " m " + strzipPath + " " + strtxtPath;

        //// 5
        ////压缩c:\freezip\下的free.txt(即文件free.txt)
        ////到c:\freezip\free.zip 直接设定为free.zip 只有文件 而没有文件夹
        //Process1.StartInfo.Arguments = " a -ep " + strzipPath + " " + strtxtPath;

        //// 6
        ////解压缩c:\freezip\free.rar
        ////到 c:\freezip\
        //strtxtPath = "c:\\freezip\\";
        //Process1.StartInfo.Arguments = " x " + strzipPath + " " + strtxtPath;

        //// 7
        ////加密压缩c:\freezip\free.txt(即文件夹及其下文件freezip\free.txt)
        ////到c:\freezip\free.zip 密码为123456 注意参数间不要空格
        //Process1.StartInfo.Arguments = " a -p123456 " + strzipPath + " " + strtxtPath;

        //// 8
        ////解压缩加密的c:\freezip\free.rar
        ////到 c:\freezip\   密码为123456 注意参数间不要空格
        //strtxtPath = "c:\\freezip\\";
        //Process1.StartInfo.Arguments = " x -p123456 " + strzipPath + " " + strtxtPath;

       //// 9 
       ////-o+ 覆盖 已经存在的文件
       //// -o- 不覆盖 已经存在的文件
       //strtxtPath = "c:\\freezip\\";
       //Process1.StartInfo.Arguments = " x -o+ " + strzipPath + " " + strtxtPath;

       ////10
       //// 只从指定的zip中
       //// 解压出free1.txt
       //// 到指定路径下
       //// 压缩包中的其他文件 不予解压
       //strtxtPath = "c:\\freezip\\";
       //Process1.StartInfo.Arguments = " x " + strzipPath + " " +" free1.txt" + " " + strtxtPath;

       //// 11
       //// 通过 -y 对所有询问回应为"是" 以便 即便发生错误 也不弹出WINRAR的窗口
       //// -cl 转换文件名为小写字母 
       //strtxtPath = "c:\\freezip\\";
       //Process1.StartInfo.Arguments = " t -y -cl " + strzipPath + " " + " free1.txt";

        Process1.Start();    
        if (Process1.HasExited)
        {
               int iExitCode = Process1.ExitCode;
                if (iExitCode == 0)
                {
                    Response.Write(iExitCode.ToString() + " 正常完成");
                }
                else
                {
                    Response.Write(iExitCode.ToString() + " 有错完成");
                }
        }
    }

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

-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<文件> 从文件读取压缩文件注释 
-- 停止开关的扫描

3楼 [楼主] 2007-01-18 10:22 freeliver54      

WinRAR.exe文件 最好是和程式同级存放   回复  引用  查看    

#4楼 [楼主] 2007-01-18 13:05 freeliver54      

不要忘记释放相关资源 
Process1.Close();   回复  引用  查看    

#5楼 [楼主] 2007-01-20 09:21 freeliver54      

//判断是否正常解压锁 
Process1.Start(); 
while (!Process1.HasExited) 
{ } 
int intExitCode = Process1.ExitCode; 
Process1.Close(); 
if (intExitCode==0) 

Response.Write("ok"); 

else 

Response.Write("sorry"); 
}   回复  引用  查看    

#6楼 2007-01-25 19:39 ywg032 [未注册用户]

压缩文件时可以同时用多个命令参数吗? 
比如说:用了-ep的同时还要用-p123456 
  回复  引用    

#7楼 [楼主] 2007-01-26 08:26 freeliver54      

可以   回复  引用  查看    

#8楼 2007-01-26 13:07 ywg032 [未注册用户]

能不能给个例子 
我昨天晚上试了好久 
不是出错就是没有效果 
谢谢!   回复  引用    

#9楼 [楼主] 2007-01-26 18:47 freeliver54      

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 -ep -p123456 " + strzipPath + " " + strtxtPath; 

上面的代码 倾你试下看   回复  引用  查看    

#10楼 2007-01-27 09:24 ywg032 [未注册用户]

非常感谢! 
成功了! 
你真行!   回复  引用    

#11楼 [楼主] 2007-01-27 16:25 freeliver54      

谢谢 一起学习 共同进步了   回复  引用  查看    

#12楼 2007-01-31 13:56 大剑师      

我想内置的zip功能更好些
  回复  引用  查看    

#13楼 2007-04-19 22:51 小生 [未注册用户]

如果 调用程序 不在默认c:\program files\下 
是不是 StartInfo.FileName=""; 
是不是 这里 要指名绝对路径   回复  引用    

#14楼 [楼主] 2007-04-20 09:01 freeliver54      

@小生 
VS2005帮助文档中 StartInfo 属性 的描述及示例: 
StartInfo 表示用于启动进程的一组参数。 
调用 Start 时,StartInfo 用于指定要启动的进程。 
唯一必须设置的 StartInfo 成员是 FileName 属性。 
通过指定 FileName 属性来启动进程, 
这样做类似于在 Windows“开始”菜单的“运行”对话框中键入信息。 
因此,FileName 属性不需要表示可执行文件。 
它可以是其扩展名已经与系统上安装的应用程序关联的任何文件类型。 
例如,如果已经将文本文件与某个编辑器(如“记事本”)关联, 
则 FileName 可以具有 .txt 扩展名; 
如果已经将 .doc 文件与某个字处理工具(如 Microsoft Word)关联, 
则它可以具有 .doc 扩展名。 
同样,“运行”对话框可以以相同的方式接受带有或不带 .exe 扩展名的可执行文件名, 
.exe 扩展名在 FileName 成员中是可选的。 
例如,可将 FileName 属性设置为“Notepad.exe”或“Notepad”。 

如果文件名涉及不可执行文件(如 .doc 文件), 
则可以包括一个谓词指定要对该文件执行什么操作。 
例如,对于以 .doc 扩展名结尾的文件, 
可以将 Verb 设置为“Print”。 
如果您手动为 Verb 属性输入一个值, 
则在 FileName 属性中指定的文件名不需要具有扩展名。 
但是,如果您使用 Verbs 属性来确定哪些谓词可用, 
则必须包括文件扩展名。 

直到在进程上调用 Start 方法时才能更改 StartInfo 属性中指定的参数。 
启动该进程之后,更改 StartInfo 值不会影响也不会重新启动关联的进程。 
如果在设置了 ProcessStartInfo.UserName 和 ProcessStartInfo.Password 属性后 
调用 Start(ProcessStartInfo) 方法, 
则将调用非托管 CreateProcessWithLogonW 函数, 
这样,即使 CreateNoWindow 属性值为 true 或者 WindowStyle 属性值为 Hidden, 
也将在新窗口中启动该进程。 

如果未使用 Start 方法启动进程, 
则 StartInfo 属性不会反映启动该进程时使用的参数。 
例如,如果使用 GetProcesses 获取计算机上运行的进程的数组, 
则每个 Process 的 StartInfo 属性将不包含启动进程时使用的原始文件名称或参数。 

启动进程后,文件名是填充(只读)MainModule 属性的文件。 
如果要在进程启动后检索与进程关联的可执行文件, 
请使用 MainModule 属性。 
如果要设置尚未为其启动关联进程的 Process 实例的可执行文件, 
请使用 StartInfo 属性的 FileName 成员。 
因为 StartInfo 属性的成员是要传递给进程的 Start 方法的参数, 
所以,启动关联进程后更改 FileName 属性不会重置 MainModule 属性。 
这些属性仅用于初始化关联的进程。 


示例: 
Sub PrintDoc() 
Dim myProcess As New Process() 

Try 
' Get the path that stores user documents. 
Dim myDocumentsPath As String = Environment.GetFolderPath(Environment.SpecialFolder.Personal) 

myProcess.StartInfo.FileName = myDocumentsPath + "\MyFile.doc" 
myProcess.StartInfo.Verb = "Print" 
myProcess.StartInfo.CreateNoWindow = True 
myProcess.Start() 
Catch e As Win32Exception 
If e.NativeErrorCode = ERROR_FILE_NOT_FOUND Then 
Console.WriteLine((e.Message + ". Check the path.")) 

Else 
If e.NativeErrorCode = ERROR_ACCESS_DENIED Then 
' Note that if your word processor might generate exceptions 
' such as this, which are handled first. 
Console.WriteLine((e.Message + ". You do not have permission to print this file.")) 
End If 
End If 
End Try 
End Sub 'PrintDoc 

及 

void PrintDoc() 

Process myProcess = new Process(); 

try 

// Get the path that stores user documents. 
string myDocumentsPath = 
Environment.GetFolderPath(Environment.SpecialFolder.Personal); 

myProcess.StartInfo.FileName = myDocumentsPath + "\\MyFile.doc"; 
myProcess.StartInfo.Verb = "Print"; 
myProcess.StartInfo.CreateNoWindow = true; 
myProcess.Start(); 

catch (Win32Exception e) 

if(e.NativeErrorCode == ERROR_FILE_NOT_FOUND) 

Console.WriteLine(e.Message + ". Check the path."); 


else if (e.NativeErrorCode == ERROR_ACCESS_DENIED) 

// Note that if your word processor might generate exceptions 
// such as this, which are handled first. 
Console.WriteLine(e.Message + 
". You do not have permission to print this file."); 




  回复  引用  查看    

#15楼 2007-05-19 00:55 小鬼 [未注册用户]

这样的方式不适合在服务器上使用,最好是使用unrar来进行解压RAR文件,如果要压缩就先使用ZIP吧。   回复  引用    

#16楼 2008-01-17 15:59 好好i [未注册用户]

楼主更你一样怎么不会呢,能给个联系方式 
  回复  引用    

#17楼 2008-09-04 09:02 EdisonWang [未注册用户]

我用过部分参数,但是好像没有达到预期的效果。 
如 “ m ”,压缩后无原文件,但是还是有,不管怎么设置 都是zip的格式, 
能说说为什么不?在线等.... 

msn:edison.wang5033@hotmail.com 

谢谢了。。。   回复  引用    

#18楼 [楼主] 2008-09-05 08:28 freeliver54      

@EdisonWang 
好啊 能贴下你的代码吗? 

有以下几个点 说下 
1.将WinRAR.exe文件 放在你执行页面的同级目录 
2.按钮事件执行如下语句 
protected void Button1_Click(object sender, EventArgs e) 

string strtxtPath = "C:\\freezip\\free.txt"; 
string strzipPath = "C:\\freezip\\free.rar"; 
System.Diagnostics.Process Process1 = new System.Diagnostics.Process(); 
Process1.StartInfo.FileName = "WinRAR.exe"; 
Process1.StartInfo.CreateNoWindow = true; 
//// 4 
//搬迁压缩c:\freezip\free.txt(即文件夹及其下文件freezip\free.txt) 
//到c:\freezip\free.rar 压缩后 原文件将不存在 
Process1.StartInfo.Arguments = " m " + strzipPath + " " + strtxtPath; 

Process1.Start(); 
if (Process1.HasExited) 

int iExitCode = Process1.ExitCode; 
if (iExitCode == 0) 

Response.Write(iExitCode.ToString() + " 正常完成"); 

else 

Response.Write(iExitCode.ToString() + " 有错完成"); 




当然也可以不放在同级目录 那就需要指定寻址路径以找到WinRAR.exe 
  回复  引用  查看    

#19楼 [楼主] 2008-09-05 08:35 freeliver54      

@EdisonWang 
再有 看下你调用的WinRAR.exe程序 是否可以执行你说的效果 

如右键点击某文件 将其添加到压缩文件 
在弹出的压缩文件名及参数中 
勾选 压缩文件格式为RAR或ZIP 
勾选 压缩选项 下的 压缩后删除源文件 
然后 确定 
看是否该WinRAR能否达到预期效果 

  回复  引用  查看    

#20楼 2009-01-09 09:38 sunjinbo [未注册用户]

博主好,我用了你这个方法调用服务器上的winrar程序,运行时在服务器上出现一个闪动窗口!有没有办法解决这个问题呢?先谢谢了!你的文章都挺好   回复  引用    

#21楼 [楼主] 2009-01-09 16:12 freeliver54      

@sunjinbo 
你好 
可尝试下 
Process1.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;   回复  引用  查看    

#22楼 [楼主] 2009-01-09 16:12 freeliver54      

.NET Framework 类库 
ProcessWindowStyle 枚举 
指定在系统启动进程时新窗口应如何显示。 

命名空间:System.Diagnostics 
程序集:System(在 system.dll 中)

原创粉丝点击