C#解压缩Zip,Rar等压缩文件(详细说明)

其实这个东西网上已经有很多了 给出了一大把  当然我也是在网上找到得 只不过 说明不够详细

经过测试 给出详细的备注; 解压的给的很详细  压缩的基本也一样 只不过参数信息不一样罢了;

利用winrar.exe的方法 其实也是因为没有办法  因为这中方法支持的格式最多

当然除了这种方法外 最起码还有三种方法可以操作(

1: ICSharpCode.SharpZipLib(开源的) 只支持zip格式的;

2: SharpCompress (用开源的就行) 只是这种方式 实际测试中.z 后缀的压缩包不能解压 当然还有一些其他的问题(如果哪位大神 要研究可以 去修改源码看看)

3:  SevenZipSharp 这种我没有试   但看介绍 好像 格式也有一些不支持;

下面就给出咱们最笨的最有效的方法

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32;
using System.IO;
using System.Diagnostics;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public string ToPath = @"D:\RARTest";
        //用于启动winrar的进程
        Process rarProcess;

        public Form1()
        {
            InitializeComponent();
        }
        //保存文件路径信息 (包含文件名和后缀名)
        string filePath=string.Empty;

        private void button1_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string file = openFileDialog1.FileName;
                this.textBox1.Text = file;
                filePath = file;
            }
        }

        //开始解压操作
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                //判断是不是有 winrar 软件 有的话就执行 没有那就哪里凉快去哪里吧
                if (Exists())
                {
                    //得到文件所在的目录 
                    string rardir = Path.GetDirectoryName(filePath);
                    //得到文件名 包含后缀
                    string rarname = Path.GetFileName(filePath);
                    //进行解压操作
                    UnCompressRAR(ToPath, rardir, rarname);
                }
                else
                {
                    MessageBox.Show("没有安装 winrar");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


        public bool Exists()
        {
            //通过注册表信息 判断是不是装有 winrar 软件
            RegistryKey the_Reg =
                Registry.LocalMachine.OpenSubKey(
                    @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe");

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


        //解压
        /// <summary>
        /// 解压操作 当然 winrar 不单单只是说支持rar的文件的操作 可以有很多种格式 几乎所有
        /// </summary>
        /// <param name="unRarPatch">要解压到得路径</param>
        /// <param name="rarPatch">rar文件目录路径 </param>
        /// <param name="rarName">rar文件名 包括后缀</param>
        /// <returns></returns>
        public string UnCompressRAR(string unRarPatch, string rarPatch, string rarName)
        {

            string the_rar;

            RegistryKey the_Reg;

            object the_Obj;

            string the_Info;

            try
            {
                //拿到我们winrar注册信息
                the_Reg =
                    Registry.LocalMachine.OpenSubKey(
                         @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe");
                //具体都有哪些键值 没有参考过 但是测试得到这个 得到的就是 winrar.exe的真是路径 用object接受
                the_Obj = the_Reg.GetValue("");

                //只不过是把 winrar.exe 路径转换成了string的形式 其实 这里有很多代码是可以简化的 但是为了直观 不做过多的处理
                the_rar = the_Obj.ToString();

                //关闭对注册表项的更改 
                the_Reg.Close();

                //如果不存在 我们准备解压到得路径 那么就创建这个路径
                if (Directory.Exists(unRarPatch) == false)
                {
                    Directory.CreateDirectory(unRarPatch);
                }

                //winrar的 命令参数  这个是解压到指定目录 覆盖文件
                the_Info = "x " + rarName + " " + unRarPatch + " -y";

                //指定启动进程时要给的一些参数
                ProcessStartInfo the_StartInfo = new ProcessStartInfo();

                //winrar.exe路径信息
                the_StartInfo.FileName = the_rar;
                //执行的命令行参数
                the_StartInfo.Arguments = the_Info;
                //窗体弹窗设置为隐藏
                the_StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

                the_StartInfo.WorkingDirectory = rarPatch;//获取压缩包路径

                rarProcess = new Process();

                rarProcess.StartInfo = the_StartInfo;

                rarProcess.Start();

                rarProcess.WaitForExit();
                if (rarProcess.HasExited)
                {
                    int exitCode = rarProcess.ExitCode;
                    if (exitCode != 0)
                    {
                        //8 内存错误 没有足够的内存进行操作
                        //7 用户错误 命令行选项错误
                        //6 打开错误 打开文件错误
                        //5 写错误 写入磁盘错误
                        //4 被锁定压缩文件 试图修改先前使用 'k' 命令锁定的压缩文件
                        //3 CRC 错误 解压缩时发生一个 CRC 错误
                        //2 致命错误 发生一个致命错误
                        //1 警告 没有发生致命错误
                        //0 成功 操作成功
                        switch (exitCode)
                        {
                            case 1:
                                throw new Exception("警告 没有发生致命错误");
                                break;
                            case 2:
                                throw new Exception("致命错误 发生一个致命错误");
                                break;
                            case 3:
                                throw new Exception("CRC 错误 解压缩时发生一个 CRC 错误");
                                break;
                            case 4:
                                throw new Exception("被锁定压缩文件 试图修改先前使用 'k' 命令锁定的压缩文件");
                                break;
                            case 5:
                                throw new Exception("写错误 写入磁盘错误");
                                break;
                            case 6:
                                throw new Exception("打开错误 打开文件错误");
                                break;
                            case 7:
                                throw new Exception("用户错误 命令行选项错误");
                                break;
                            case 8:
                                throw new Exception("内存错误 没有足够的内存进行操作");
                                break;
                        }
                        throw new Exception("致命错误 发生一个致命错误: "+exitCode+"  ");
                    }
                }


                rarProcess.Close();

            }

            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (rarProcess != null)
                {
                    rarProcess.Close();
                }
            }

            return unRarPatch;

        }


        //压缩
        public void CompressRAR(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.LocalMachine.OpenSubKey(
                         @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe");

                the_Obj = the_Reg.GetValue("");

                the_rar = the_Obj.ToString();

                the_Reg.Close();

            
                Directory.CreateDirectory(patch);

                //命令参数


                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;

            }

        }
    }
}

 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

 

posted @ 2013-07-28 17:52  lizhiqiang1191  阅读(1508)  评论(0编辑  收藏  举报