本文的原理是借助Windows平台安装的WinRAR(WinZip)实现C#程序的调用(注:WinRAR压缩解压WinZip同样适用)。

先来看WinRAR(WinZip)自身的支持调用命令:

压缩命令:a {0} {1} -r 【{0}:压缩后文件名|{1}:待压缩的文件物理路径】

ex:"a 你妹.rar f:\\MM -r" (含义为将f盘下MM的文件夹压缩为"你妹.rar"文件)

解压命令:x {0} {1} -y 【{0}:待解压文件名称|{1}:待解压文件物理路径】

ex:"x 幺妹.rar f:\\幺妹 -y"(待压缩文件物理路径:"f:\\幺妹\\幺妹.rar")

参数说明

参数

含义

a

添加文件到压缩包

x

以完整路径从压缩包解开压缩

WinZip(WinRAR)调用通用类

using System;
using System.Collections.Generic;
using System.Text; //--------------using
using System.Diagnostics;
using Microsoft.Win32;
using System.IO; /// <summary>
/// Name:Stone
/// DateTime: 2011/12/31 16:39:26
/// Description:WinRAR压缩
/// </summary>
public class WinRARCSharp
{
// WinRAR安装注册表key
private const string WinRAR_KEY = @"WinRAR.ZIP\shell\open\command"; /// <summary>
/// 利用 WinRAR 进行压缩
/// </summary>
/// <param name="path">将要被压缩的文件夹(绝对路径)</param>
/// <param name="rarPath">压缩后的 .rar 的存放目录(绝对路径)</param>
/// <param name="rarName">压缩文件的名称(包括后缀)</param>
/// <returns>true 或 false。压缩成功返回 true,反之,false。</returns>
public bool RAR(string path, string rarPath, string rarName)
{
bool flag = false;
string rarexe; //WinRAR.exe 的完整路径
RegistryKey regkey; //注册表键
Object regvalue; //键值
string cmd; //WinRAR 命令参数
ProcessStartInfo startinfo;
Process process;
try
{
regkey = Registry.ClassesRoot.OpenSubKey(WinRAR_KEY);
regvalue = regkey.GetValue(""); // 键值为 "d:\Program Files\WinRAR\WinRAR.exe" "%1"
rarexe = regvalue.ToString();
regkey.Close();
rarexe = rarexe.Substring(1, rarexe.Length - 7); // d:\Program Files\WinRAR\WinRAR.exe Directory.CreateDirectory(path);
//压缩命令,相当于在要压缩的文件夹(path)上点右键->WinRAR->添加到压缩文件->输入压缩文件名(rarName)
cmd = string.Format("a {0} {1} -r",
rarName,
path);
startinfo = new ProcessStartInfo();
startinfo.FileName = rarexe;
startinfo.Arguments = cmd; //设置命令参数
startinfo.WindowStyle = ProcessWindowStyle.Hidden; //隐藏 WinRAR 窗口 startinfo.WorkingDirectory = rarPath;
process = new Process();
process.StartInfo = startinfo;
process.Start();
process.WaitForExit(); //无限期等待进程 winrar.exe 退出
if (process.HasExited)
{
flag = true;
}
process.Close();
}
catch (Exception e)
{
throw e;
}
return flag;
}
/// <summary>
/// 利用 WinRAR 进行解压缩
/// </summary>
/// <param name="path">文件解压路径(绝对)</param>
/// <param name="rarPath">将要解压缩的 .rar 文件的存放目录(绝对路径)</param>
/// <param name="rarName">将要解压缩的 .rar 文件名(包括后缀)</param>
/// <returns>true 或 false。解压缩成功返回 true,反之,false。</returns>
public bool UnRAR(string path, string rarPath, string rarName)
{
bool flag = false;
string rarexe;
RegistryKey regkey;
Object regvalue;
string cmd;
ProcessStartInfo startinfo;
Process process;
try
{
regkey = Registry.ClassesRoot.OpenSubKey(WinRAR_KEY);
regvalue = regkey.GetValue("");
rarexe = regvalue.ToString();
regkey.Close();
rarexe = rarexe.Substring(1, rarexe.Length - 7); Directory.CreateDirectory(path);
//解压缩命令,相当于在要压缩文件(rarName)上点右键->WinRAR->解压到当前文件夹
cmd = string.Format("x {0} {1} -y",
rarName,
path);
startinfo = new ProcessStartInfo();
startinfo.FileName = rarexe;
startinfo.Arguments = cmd;
startinfo.WindowStyle = ProcessWindowStyle.Hidden; startinfo.WorkingDirectory = rarPath;
process = new Process();
process.StartInfo = startinfo;
process.Start();
process.WaitForExit();
if (process.HasExited)
{
flag = true;
}
process.Close();
}
catch (Exception e)
{
throw e;
}
return flag;
}
}

  调用方法

WinRARCSharp win = new WinRARCSharp();

win.RAR("F:\\aaa\\", "f:\\", "a.rar"); // 压缩(将“f:\\aaa\\”目录文件压缩到“f:\\a.rar”)

win.UnRAR("f:\\呦M.zip", "f:\\MM", "GG"); // 解压(将“f:\\呦M.zip”解压到“f:\\MM\\GG”目录下)

  7z压缩通用类:

using System;
using System.Collections.Generic;
using System.Text; using Microsoft.Win32;
using System.Diagnostics;
using System.IO; /// <summary>
/// Name:Stone
/// DateTime: 2012/1/4 16:26:08
/// Description:7Z解压管理类
/// </summary>
public class _7zRAR
{ // 7z.exe 安装地址
private const string _7zEXE = @"D:\Program Files (x86)\7-Zip\7z.exe"; /// <summary>
/// 利用 7zExE 进行压缩
/// </summary>
/// <param name="_7zPath">将要被压缩的文件夹(物理路径)</param>
/// <param name="filePath">压缩后的的存放目录(物理路径)</param>
/// <returns>true 或 false。压缩成功返回 true,反之,false。</returns>
public static bool Un7zRAR(string _7zPath, string filePath)
{
bool flag = false; string cmd;
ProcessStartInfo startinfo;
Process process;
try
{
cmd = String.Format(@"x {0} -o{1} -y",
_7zPath, filePath);
startinfo = new ProcessStartInfo();
startinfo.FileName = _7zEXE;
startinfo.Arguments = cmd;
startinfo.WindowStyle = ProcessWindowStyle.Hidden; process = new Process();
process.StartInfo = startinfo;
process.Start();
process.WaitForExit();
if (process.HasExited)
{
flag = true;
}
process.Close();
}
catch (Exception e)
{
throw e;
}
return flag;
}
}

  

WinRAR(WinZip)压缩与解压实现(C#版Window平台)的更多相关文章

  1. 【转载】使用Winrar对压缩文件进行加密,并且给定解压密码

    有时候我们从网上下载的压缩包文件,如.rar文件.zip文件等,解压的时候需要输入解压密码才可顺利解压,否则解压失败.其实像这种情况,是压缩包制作者在压缩文件的时候对压缩文件进行了加密,输入了压缩包解 ...

  2. java压缩文件解压:调用WinRAR5命令强于自己写代码实现

    最近,手上维护着一个几年前的系统,技术是用的JSP+Strust2,系统提供了rar和zip两种压缩格式的解压功能,后台是用java实现的 1.解压rar格式,采用的是java-unrar-0.3.j ...

  3. linux下关于压缩、解压相关的操作

    本文转自: http://alex09.iteye.com/blog/647128 很不错的linux下关于压缩.解压相关的操作,适合于linux初学者.   .tar  解包:tar xvf Fil ...

  4. 【转】winrar命令行详解

    从命令行也可以运行 WinRAR 命令,常规的命令行语法描述如下: WinRAR  <命令> -<开关1> -<开关N> <压缩文件> <文件.. ...

  5. C#利用WinRAR实现压缩和解压缩

    using System; using Microsoft.Win32; using System.Diagnostics; using System.IO; namespace MSCL { /// ...

  6. linux压缩文件——解压方法

    linux下 tar解压 gz解压 bz2等各种解压文件使用方法 .tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar ...

  7. Linux操作系统中,*.zip、*.tar、*.tar.gz、*.tar.bz2、*.tar.xz、*.jar、*.7z等格式的压缩与解压

    zip格式 压缩: zip -r [目标文件名].zip [原文件/目录名] 解压: unzip [原文件名].zip 注:-r参数代表递归 tar格式(该格式仅仅打包,不压缩) 打包:tar -cv ...

  8. Linux压缩与解压常用命令

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  9. Asp.net中文件的压缩与解压

    这里笔者为大家介绍在asp.net中使用文件的压缩与解压.在asp.net中使用压缩给大家带来的好处是显而易见的,首先是减小了服务器端文件存储的空间,其次下载时候下载的是压缩文件想必也会有效果吧,特别 ...

随机推荐

  1. Pyinstaller打包matplotlib.pyplot画图时提示无法找到Qt插件的解决办法

    This application failed to start because it could not find or load the Qt platform plugin "wind ...

  2. 转载Json和Xml的区别,以及它们的底层是如何处理的

    XML:可扩展标记语言       JSON:轻量级的数据交换格式 区别: 1.可读性方面:基本相同,Xml的可读性较好些: 2.可扩展性方面:都有较好的扩展性: 3.编码难度方面:json的编码较容 ...

  3. P4718 【模板】Pollard-Rho算法

    题面 传送门 题解 题解 太神仙了学不来orz //minamoto #include<bits/stdc++.h> #define R register #define ll long ...

  4. mysql 保存23:59:59 自动加一秒

    mysql保存系统传递的时间会诡异的增加一秒钟使用如下工具类: public static Date getEndOfDay(Date date) { Calendar calendarEnd = C ...

  5. linux模式切换,进程切换

    内核态和用户态的切换: 用户态到内核态的转换:1.进行系统调用,2.异步中断,3.外部硬件中断 检查特权级别的变化:当异常发生在用户态,而异常处理函数则必须运行在内核态,则此时必须调用内核态的堆栈(系 ...

  6. 数据结构5: 链表(单链表)的基本操作及C语言实现

    逻辑结构上一个挨一个的数据,在实际存储时,并没有像顺序表那样也相互紧挨着.恰恰相反,数据随机分布在内存中的各个位置,这种存储结构称为线性表的链式存储. 由于分散存储,为了能够体现出数据元素之间的逻辑关 ...

  7. Maven入门(二)pom.xml和核心概念

    一.pom.xml文件说明 1.pom意思就是project object model. 2.pom.xml包含了项目构建的信息,包括项目的信息.项目的依赖等. 3.pom.xml文件是可以继承的,大 ...

  8. python编程技巧

  9. FileWriter 中午乱码

      解决办法 BufferedWriter writer = new BufferedWriter (new OutputStreamWriter (new FileOutputStream (fil ...

  10. vscode 注册表

    Windows Registry Editor Version 5.00 ; Open files [HKEY_CLASSES_ROOT\*\shell\Open with VS Code] @=&q ...