C# 文件解压

ZipEnty zp = new ZipEnty();//ZipEnty类 随后贴出
zp.UnZip(realFileName, "E:\\WebAndroid\\Android\\", null);
//待解压目录,解压后目录,密码

//ZipEnty
#region
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using ICSharpCode.SharpZipLib.Zip;
using System.IO.Compression;
using System.IO;
using Microsoft.Win32;

using System.Diagnostics;
using System.Text;

namespace RedPlatform.Models.Zip
{
    /// <summary>
    /// WebForm1 的摘要说明。
    /// </summary>
    public class ZipEnty
    {
        public string ServerDir = "E:\\WebAndroid\\Android\\";
        //private void Page_Load(object sender, System.EventArgs e)
        //{
        //    // 在此处放置用户代码以初始化页面
          
        //    //this.ZipFile("01.txt*02.txt*000.zip");  //只是示例,具体的大家自己去实现
        //    //this.ZipFile("01.txt*02.txt*001.zip");
        //    this.UnZipFile("vid20140121150506.zip");
        //}


        public string ShortDir(string s)
        {
            ServerDir = "E:\\GT视频\\GT视频管理系统部署\\Android\\";
            //将文件的绝对路径转为相对路径
            string d = s.Replace(ServerDir, "");
            return d;
        }



        //压缩文件 p 为客户端传回来的文件列表:文件名+压缩包的名称
        public void ZipFile(string p)
        {
            string[] tmp = p.Split(new char[] { '*' });  //分离文件列表
            if (tmp[tmp.Length - 1] != "")  //压缩包名称不为空
            {
                ZipOutputStream u = new ZipOutputStream(File.Create(ServerDir + tmp[tmp.Length - 1]));            //新建压缩文件流 “ZipOutputStream”
                for (int i = 0; i < tmp.Length - 1; i++)
                {
                    if (tmp[i] != "")  //分离出来的文件名不为空
                    {
                        this.AddZipEntry(tmp[i], u, out u); //向压缩文件流加入内容
                    }
                }
                u.Finish(); // 结束压缩
                u.Close();
            }
        }

        //添加压缩项目:p 为需压缩的文件或文件夹; u 为现有的源ZipOutputStream;  out j为已添加“ZipEntry”的“ZipOutputStream”
        public void AddZipEntry(string p, ZipOutputStream u, out ZipOutputStream j)
        {
            string s = ServerDir + p;

            if (Directory.Exists(s)) //文件夹的处理
            {
                DirectoryInfo di = new DirectoryInfo(s);

                //***********以下内容是修订后添加的***********

                if (di.GetDirectories().Length <= 0)   //没有子目录
                {
                    ZipEntry z = new ZipEntry(p + ""); //末尾“""”用于文件夹的标记
                    u.PutNextEntry(z);
                }

                //***************以上内容是修订后添加的***************


                foreach (DirectoryInfo tem in di.GetDirectories()) //获取子目录
                {
                    ZipEntry z = new ZipEntry(this.ShortDir(tem.FullName) + ""); //末尾“""”用于文件夹的标记
                    u.PutNextEntry(z);    //此句不可少,否则空目录不会被添加
                    s = this.ShortDir(tem.FullName);
                    this.AddZipEntry(s, u, out u);       //递归
                }
                foreach (FileInfo temp in di.GetFiles())  //获取此目录的文件
                {
                    s = this.ShortDir(temp.FullName);
                    this.AddZipEntry(s, u, out u);       //递归
                }
            }
            else if (File.Exists(s)) //文件的处理
            {
                u.SetLevel(9);      //压缩等级
                FileStream f = File.OpenRead(s);
                byte[] b = new byte[f.Length];
                f.Read(b, 0, b.Length);           //将文件流加入缓冲字节中
                ZipEntry z = new ZipEntry(this.ShortDir(s));
                u.PutNextEntry(z);              //为压缩文件流提供一个容器
                u.Write(b, 0, b.Length); //写入字节
                f.Close();
            }
            j = u;    //返回已添加数据的“ZipOutputStream”
        }


        public void UnZipFile(string p)   //解压缩
        {

            string un_time = System.DateTime.Now.ToString("yyyyMMddhhmmss");
            string un_dir = ServerDir + "Unzip-" + un_time;
            Directory.CreateDirectory(un_dir);     //创建以解压时间为名称的文件夹
            ZipInputStream f = new ZipInputStream(File.OpenRead(ServerDir + p)); //读取压缩文件,并用此文件流新建 “ZipInputStream”对象
            //ICSharpCode.SharpZipLib.Zip.ZipFile f1 = new ICSharpCode.SharpZipLib.Zip.ZipFile(ServerDir + p);
            
            A: ZipEntry zp = f.GetNextEntry();    //获取解压文件流中的项目。 另注(我的理解):在压缩包里每个文件都以“ZipEntry”形式存在,其中包括存放文件的目录信息。如果空目录被压缩,该目录下将出现一个名称为空、大小为 0 、“Crc”属性为 00000000 的“文件”。此文件只是个标记,不会被解压。

            while (zp != null)
            {
                string un_tmp2;
                if (zp.Name.IndexOf("") >= 0) //获取文件的目录信息
                {
                    int tmp1 = zp.Name.LastIndexOf("");
                    un_tmp2 = zp.Name.Substring(0, tmp1);
                    Directory.CreateDirectory(un_dir + "" + un_tmp2 + ""); //必须先创建目录,否则解压失败 --- (A) 关系到下面的步骤(B)
                }
                if (!zp.IsDirectory && zp.Crc != 00000000L) //此“ZipEntry”不是“标记文件”
                {
                    int i = 2048;
                    byte[] b = new byte[i];  //每次缓冲 2048 字节
                    FileStream s = File.Create(un_dir + "" + zp.Name); //(B)-新建文件流
                    while (true) //持续读取字节,直到一个“ZipEntry”字节读完
                    {
                        i = f.Read(b, 0, b.Length); //读取“ZipEntry”中的字节
                        if (i > 0)
                        {
                            s.Write(b, 0, i); //将字节写入新建的文件流
                        }
                        else
                        {
                            break; //读取的字节为 0 ,跳出循环
                        }
                    }
                    s.Close();
                }
                goto A; //进入下一个“ZipEntry”
            }
            f.Close();
        }

        #region 解压文件
        /// <summary>
        /// 解压功能(解压压缩文件到指定目录)
        /// </summary>
        /// <param name="FileToUpZip">待解压的文件</param>
        /// <param name="ZipedFolder">指定解压目标目录</param>
        /// <param name="Password"></param>
        public static void WritetoLog(string txt)
        {

            string path = "D:\\mylog\\log.txt";
            //path  += DateTime.Now.ToString("yyyyMMdd-hhmmss") + ".txt";

            FileStream fs;

            StreamWriter sw;

            fs = new FileStream(path, FileMode.Append);

            sw = new StreamWriter(fs, Encoding.Default);

            sw.Write(txt);
            sw.Close();
            fs.Close();



        }
        public void UnZip(string FileToUpZip, string ZipedFolder, string Password)
        {
            if (!File.Exists(FileToUpZip))
            {
                return;
            }

            if (!Directory.Exists(ZipedFolder))
            {
                Directory.CreateDirectory(ZipedFolder);
            }

            ZipInputStream s = null;
            ZipEntry theEntry = null;

            string fileName;
            FileStream streamWriter = null;
            try
            {
                s = new ZipInputStream(File.OpenRead(FileToUpZip));
                s.Password = Password;
                theEntry = s.GetNextEntry();
                //while ((theEntry = s.GetNextEntry()) != null)
                //{   
                if (theEntry.Name != String.Empty)
                {
                    fileName = Path.Combine(ZipedFolder, theEntry.Name);
                    /**/
                    ///判断文件路径是否是文件夹
                    if (fileName.EndsWith("/") || fileName.EndsWith("\\"))
                    {
                        Directory.CreateDirectory(fileName);
                        //continue;
                    }

                    streamWriter = File.Create(fileName);
                    int size = 2048;
                    byte[] data = new byte[2048];
                    while (true)
                    {
                        size = s.Read(data, 0, data.Length);
                        if (size > 0)
                        {
                            streamWriter.Write(data, 0, size);
                        }
                        else
                        {
                            break;
                        }
                    }

                    //File.Delete(FileToUpZip);
                }
                //}
            }
            catch (Exception ex)
            {
                WritetoLog(ex.ToString());
            }
            finally
            {
                if (streamWriter != null)
                {
                    streamWriter.Close();
                    streamWriter = null;
                }
                if (theEntry != null)
                {
                    theEntry = null;
                }
                if (s != null)
                {
                    s.Close();
                    s = null;
                }
                GC.Collect();
                GC.Collect(1);
            }
        }
        #endregion



        /// <summary>
        /// //解压  必须装有WinRar
        /// </summary>
        /// <param name="rarfilepath"></param> //压缩文件路劲
        /// <param name="filepath"></param>   //解压保存路径
        public  string uncompress(string rarfilepath, string filepath)
        {
            try
            {
                string rar;
                RegistryKey reg;
                string args;
                ProcessStartInfo startInfo;
                Process process;
                reg = Registry.ClassesRoot.OpenSubKey(@"Applications/WinRar.exe/Shell/Open/Command");//WinRar位置
                rar = reg.GetValue("").ToString();
                reg.Close();
                rar = rar.Substring(1, rar.Length - 7);
                args = " X " + rarfilepath + " " + filepath;
                startInfo = new ProcessStartInfo();
                startInfo.FileName = rar;
                startInfo.Arguments = args;
                startInfo.WindowStyle = ProcessWindowStyle.Hidden;
                process = new Process();
                process.StartInfo = startInfo;
                process.Start();
                return "success";
            }
            catch (Exception ex)
            {
                return ex.ToString();
            }
        }


       




        
    }
}
#endregion

  

posted @ 2014-02-14 16:45  好咖  阅读(382)  评论(1编辑  收藏  举报