WinRAR(WinZip)压缩与解压实现(C#版Window平台)

本文的原理是借助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;
    }
}

  

时间: 2024-07-30 20:31:41

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

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

最近,手上维护着一个几年前的系统,技术是用的JSP+Strust2,系统提供了rar和zip两种压缩格式的解压功能,后台是用java实现的 1.解压rar格式,采用的是java-unrar-0.3.jar 2.解压zip格式,采用的是commons-compress-1.4.1.jar 但最近根据用户反馈的问题,发现系统存在两个关于压缩文件解压的问题: 1.有些压缩文件解压之后出现中文乱码: 2.有些压缩文件根本不能解压 为了弥补上述两个问题,在之前代码的基础上打了一些补丁,来解决zip压缩包乱

linux中常用的压缩、解压命令详解

不管在windows中还是在linux中,我们会经常看到各种压缩的文件,此刻我们需要使用就得解压,在这就介绍介绍linux中解压.压缩的命令. 在做实验之前,我们先创建几个文件,大小都是100M,方便我们更能清晰理解. 一.compress[选项]file(不是太常用,而且tab键还不能补齐) ①compress file 压缩文件,其中我们可以看到compress压缩的文件是.Z结尾的压缩包. ② -d file 解压文件,但压缩文件会丢失,相当于uncompress 在这我们可以看到,不管是

iOS开发中的压缩以及解压

事实上,在iOS开发中,压缩与解压,我都是采用第三方框架SSZipArchive实现的 gitHub地址:   https://github.com/ZipArchive/ZipArchive 上面有详细的使用方法 因为ZipArchive不支持ARC,所以如果你的工程开启了ARC,那么就需要对ZipArchive设置一下.在ZipArchive.mm编译选项中,增加-fno-objc-arc即可. 最后,需要为工程链接libz.dylib动态链接库. 使用示范(压缩): // 获得mainBu

Java的压缩、解压及压缩加密、解密解压 例子

为了节约带宽.加快传送速度,http协议支持gzip的压缩,但如果我们的app与后台不是通过http协议通讯的,那么压缩.解压这个流程需要自己写.下面给出compress和decompress的代码: public static byte[] compress(byte[] data) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 压缩 GZIPOutputStream gos =

linux 打包、压缩、解压

linux下打包.压缩.解压方法: 方法一: ==打包 # tar cvf 123.tar 目录名   将目录打包为123.tar的文件  打包后并不压缩 c--创建  v--详细  f--文件  x--解压  z---对应***.gz ==压缩 # gzip etc1.tar # bzip2 etc2.tar # xz etc3.tar ==解压 # gzip -d etc1.tar.gz # bzip2 -d etc2.tar.bz2 # xz -d etc3.tar.xz ==解包 # t

shell脚本中if与case使用,查找文件locate与find的使用,压缩,解压及归档工具

shell脚本中if与case使用 查找文件locate与find的使用 压缩,解压及归档工具 执行的循序  顺序执行  选择执行  循环执行 条件语句if if只是一个有含义的词,不能单独作为指令使用. 单分支 if 条件判断:then 条件为真的分支代码 fi 双分支 if 判断条件:then 条件为真的分支代码 else 条件为假的分支代码 fi 多分支 if 判断条件1, if-true elif 判断条件2,then if-ture elif 判断条件3,then if-ture ..

linux压缩、解压和归档

1      简介 压缩格式  gz bz2 xz zip Z 压缩算法:算法不同,压缩比也不相同 压缩比:(压缩前的文件大小-压缩后的文件大小)/压缩前的文件大小 文本文件压缩比大,图片视频比较小 xz>bz2>gz2>Z #这个对于大文件生效,小文件未必 常用的压缩解压工具: compress/uncompress .Z (比较老的压缩算法,比较少使用了) gzip/gunzip .gz (不支持目录压缩) bzip2/bunzip2 .bz2不支持目录压缩) xz/unxz .xz

iOS开发——网络编程OC篇&amp;(八)文件压缩与解压

文件压缩与解压 一.技术方案1.第三方框架:SSZipArchive2.依赖的动态库:libz.dylib 二.压缩11.第一个方法/** zipFile :产生的zip文件的最终路径 directory : 需要进行的压缩的文件夹路径 */[SSZipArchive createZipFileAtPath:zipFile withContentsOfDirectory:directory]; 2.第一个方法/** zipFile :产生的zip文件的最终路径 files : 这是一个数组,数组

java基础之zip(压缩、解压)

本程序依赖第三方包Ant.jar.因为java自带的java.utils.zip.ZipOutputStream对一些敏感中文路径会抛出异常. package javax.zip; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.Ou