读书人

关于C#调用系统中的WinRAR软件来解压

发布时间: 2012-09-17 12:06:51 作者: rapoo

关于C#调用系统中的WinRAR软件,来解压带密码压缩文件的问题
由于刚开始用C#写东西,最近公司要做一个小工具,就是解压公司带固定解压密码的压缩文件,后缀为.rar,或.zip,我想调用系统本身带的WinRAR解压缩工具来执行解压,现在其他东西代码都写好了,结果解压的时候需要的解压密码加不进去,我把代码贴出来,请有经验的大大们帮我看看吧,添加解压密码的代码应该怎么写呢?非常感谢,大半夜的,呵呵,大家辛苦!
源码如下:
解压类:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Diagnostics;
using Microsoft.Win32;
using System.Security;
using System.Windows.Forms;
namespace VstTxt
{
class Class2
{
///检测是否安装了Winrar

public bool Exists()
{

RegistryKey the_Reg =
Registry.LocalMachine.OpenSubKey(
@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe");

return !string.IsNullOrEmpty(the_Reg.GetValue("").ToString());

}


public string unCompressRAR(string unRarPatch, string rarPatch, string rarName)

{
string the_rar;
RegistryKey the_Reg;
object the_Obj;
string the_Info;
try
{
the_Reg =
Registry.LocalMachine.OpenSubKey(
@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe");

the_Obj = the_Reg.GetValue("");
the_rar = the_Obj.ToString();
the_Reg.Close();
//the_rar = the_rar.Substring(1, the_rar.Length - 7);
if (Directory.Exists(unRarPatch) == false)

{
Directory.CreateDirectory(unRarPatch);
}

50行: the_Info = "x " + rarName + " " + unRarPatch + " -y";
ProcessStartInfo the_StartInfo = new ProcessStartInfo();
the_StartInfo.FileName = the_rar;
53行: //the_StartInfo.Password = StringToSecureString("C1_a2_P3_i4_N5_f6_o7");
the_StartInfo.Arguments = the_Info;
the_StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
the_StartInfo.WorkingDirectory = rarPatch;//获取压缩包路径

Process the_Process = new Process();
the_Process.StartInfo = the_StartInfo;

the_Process.StartInfo.UseShellExecute = false;
the_Process.Start();
the_Process.WaitForExit();
the_Process.Close();

}
catch (Exception ex)
{
throw ex;
}
return unRarPatch;
}

static SecureString StringToSecureString(String value)
{
SecureString password = new SecureString();
char[] pass = value.ToCharArray();
for (int i = 0; i < pass.Length; i++)
{
password.AppendChar(pass[i]);
}
return password;
}
}
}

页面调用代码:
private void button3_Click(object sender, EventArgs e)
{
if (textBox1.Text.ToString().Trim() == "" || textBox2.Text.ToString().Trim() == "")
{
MessageBox.Show("‘解压文件地址’和‘目标文件地址’都不能为空!");
return;


}
string pah1 = textBox1.Text.ToString().Trim();//-需要解压文件路径...
string pah2 = textBox2.Text.ToString().Trim();//-文件解压目标路径...
Class2 winrar = new Class2();
try
{
if (winrar.Exists())
{
string pah3= winrar.unCompressRAR(pah2.ToString().Trim(), "", pah1.ToString().Trim());
if (pah3.ToString() == pah2.ToString())
{
MessageBox.Show("解压成功!解压后的文件路径:" + pah3.ToString());
//this.Close();
}
}
else
{
MessageBox.Show("系统检测到您计算机没安装‘WinRAR’解压软件,请先安装!");
return;
}
}
catch (Exception ex)
{
textBox1.Text = "";
textBox2.Text = "";
throw ex;
}

现在代码已经可以解压没有密码的压缩文件了,如果有密码的就会卡在输入密码那个界面就不往下执行了,需要手动输入密码,确认才会解压出来,请问大家:在那个加压类里面应该加上一句什么样的代码,才可以把密码自动带进去呢?开始的时候我在53行那里加了这样一句代码:the_StartInfo.Password = StringToSecureString("C1_a2_P3_i4_N5_f6_o7");括号内的就是固定的解压密码,可是运行发现没有用,一解压还是卡到输入密码那界面去了,清有经验的大大们帮帮忙吧....
开始的时候我在50行那里这样写过: the_Info = "x -pC1_a2_P3_i4_N5_f6_o7" + rarName + " " + unRarPatch + " -y";
可是还是不行...我不知道应该怎么处理了...大家帮帮忙吧..大半夜的..打扰大家..实在抱歉哈...


[解决办法]
http://blog.csdn.net/haitaoq/article/details/5303736
[解决办法]
运行cmd, 再运行unrar.exe,然后它会列出所有命令行参数的简单说明。

C# code
C:\Documents and Settings\wang>"C:\Program Files\WinRAR\UnRAR.exe"UNRAR 3.80 免费软件      版权 (C) 1993-2008 Alexander Roshal所有用法:     unrar <命令> -<开关 1> -<开关 N> <压缩文件> <文件...>               <@列表文件...> <解压路径\><命令>  e             解压压缩文件到当前目录  l[t,b]        列出压缩文件[技术信息,简洁]  p             打印文件到标准输出设备  t             测试压缩文件  v[t,b]        详细列出压缩文件[技术信息,简洁]  x             用绝对路径解压文件<开关>  -             停止扫描  ac            压缩或解压后清除存档属性  ad            添加压缩文件名到目标路径  ap<格式>      添加路径到压缩文件中  av-           禁用用户身份校验  c-            禁用注释显示  cfg-          禁用读取配置  cl            名称转换为小写  cu            名称转换为大写  dh            打开共享文件  ep            从名称中排除路径  ep3           扩展路径为包含盘符的完全路径  f             刷新文件  id[c,d,p,q]   禁用消息  ierr          发送所有消息到标准错误设备  inul          禁用所有消息  ioff          完成一个操作后关闭 PC 电源  kb            保留损坏的已解压文件  n<文件>       仅包含指定的文件  n@            从标准输入设备读取文件名到包括  n@<列表>      在指定的文件列表包括文件  o[+|-]        设置覆盖模式  oc            设置 NTFS 压缩属性  or            自动重命名文件  ow            保存或恢复文件所有者和组  p[密码]       设置密码  p-            不询问密码  r             递归子目录  ri<P>[:<S>]   设置优先级(0-默认,1-最小..15-最大)和以毫秒为单位的休眠时间  sl<大小>      处理小于指定大小的文件  sm<大小>      处理超过指定大小的文件  ta<日期>      添加日期 <日期> 后修改的文件,日期格式 YYYYMMDDHHMMSS  tb<日期>      添加日期 <日期> 前修改的文件,日期格式 YYYYMMDDHHMMSS  tn<时间>      添加 <时间> 以后的文件  to<时间>      添加 <时间> 以前的文件  ts<m,c,a>[N]  保存或恢复文件时间(修改,创建,访问)  u             更新文件  v             列出所有卷  ver[n]        文件版本控制  vp            每卷之前暂停  x<文件>       排除指定的文件  x@            从标准输入设备读取要排除的文件名  x@<列表>      排除指定列表文件中的文件  y             假设对全部询问都回答是
[解决办法]
http://tieba.baidu.com/p/1115684073

winrar-命令行方式解压带密码的压缩文件

x:\path\rar.exe -y x -p解压密码 "c:\test.rar" "d:\"

读书人网 >C#

热点推荐