苏飞论坛广告位

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

分布式系统框架(V1.3) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程 - 订阅更新

HttpHelper万能框架(V2.2) HttpHelper官方出品,无敌框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V1.9) 最牛的爬虫类,没有爬不到只有想不到 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 5412|回复: 6

[压缩解压缩] SharpZip--压缩、解压缩帮助类

[复制链接]
  • TA的每日心情
    开心
    前天 11:24
  • 签到天数: 602 天

    [LV.9]以坛为家II

    发表于 2014-1-16 08:54:53 | 显示全部楼层 |阅读模式
    SharpZip--压缩、解压缩帮助类
    导读部分
    -------------------------------------------------------------------------------------------------------------
    C#基类库苏飞版--系列教程导航
    http://www.sufeinet.com/thread-655-1-1.html
    最新的harpZip类下载:
    http://www.sufeinet.com/thread-655-1-1.html


    请大家直接去下载基类库
    里面有三个类都是用于压缩和解压缩的。
    大家看下图片
    20140116085047.png
    看下面代码吧

    [C#] 纯文本查看 复制代码
    /// <summary>
    /// 类说明:SharpZip
    /// 编 码 人:苏飞
    /// 联系方式:361983679  
    /// 更新网站:[url=http://www.sufeinet.com/thread-655-1-1.html]http://www.sufeinet.com/thread-655-1-1.html[/url]
    /// </summary>
    using System;
    using System.IO;
    using System.Diagnostics;
    using Microsoft.Win32;
    
    using ICSharpCode.SharpZipLib.Checksums;
    using ICSharpCode.SharpZipLib.Zip;
    
    ///压缩、解压缩类
    namespace DotNet.Utilities
    {
        public class SharpZip
        {
            public SharpZip()
            { }
    
            /// <summary>
            /// 压缩
            /// </summary> 
            /// <param name="filename"> 压缩后的文件名(包含物理路径)</param>
            /// <param name="directory">待压缩的文件夹(包含物理路径)</param>
            public static void PackFiles(string filename, string directory)
            {
                try
                {
                    FastZip fz = new FastZip();
                    fz.CreateEmptyDirectories = true;
                    fz.CreateZip(filename, directory, true, "");
                    fz = null;
                }
                catch (Exception)
                {
                    throw;
                }
            }
    
            /// <summary>
            /// 解压缩
            /// </summary>
            /// <param name="file">待解压文件名(包含物理路径)</param>
            /// <param name="dir"> 解压到哪个目录中(包含物理路径)</param>
            public static bool UnpackFiles(string file, string dir)
            {
                try
                {
                    if (!Directory.Exists(dir))
                    {
                        Directory.CreateDirectory(dir);
                    }
                    ZipInputStream s = new ZipInputStream(File.OpenRead(file));
                    ZipEntry theEntry;
                    while ((theEntry = s.GetNextEntry()) != null)
                    {
                        string directoryName = Path.GetDirectoryName(theEntry.Name);
                        string fileName = Path.GetFileName(theEntry.Name);
                        if (directoryName != String.Empty)
                        {
                            Directory.CreateDirectory(dir + directoryName);
                        }
                        if (fileName != String.Empty)
                        {
                            FileStream streamWriter = File.Create(dir + theEntry.Name);
                            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;
                                }
                            }
                            streamWriter.Close();
                        }
                    }
                    s.Close();
                    return true;
                }
                catch (Exception)
                {
                    throw;
                }
            }
        }
    
        public class ClassZip
        {
            #region 私有方法
            /// <summary>
            /// 递归压缩文件夹方法
            /// </summary>
            private static bool ZipFileDictory(string FolderToZip, ZipOutputStream s, string ParentFolderName)
            {
                bool res = true;
                string[] folders, filenames;
                ZipEntry entry = null;
                FileStream fs = null;
                Crc32 crc = new Crc32();
                try
                {
                    entry = new ZipEntry(Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip) + "/"));
                    s.PutNextEntry(entry);
                    s.Flush();
                    filenames = Directory.GetFiles(FolderToZip);
                    foreach (string file in filenames)
                    {
                        fs = File.OpenRead(file);
                        byte[] buffer = new byte[fs.Length];
                        fs.Read(buffer, 0, buffer.Length);
                        entry = new ZipEntry(Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip) + "/" + Path.GetFileName(file)));
                        entry.DateTime = DateTime.Now;
                        entry.Size = fs.Length;
                        fs.Close();
                        crc.Reset();
                        crc.Update(buffer);
                        entry.Crc = crc.Value;
                        s.PutNextEntry(entry);
                        s.Write(buffer, 0, buffer.Length);
                    }
                }
                catch
                {
                    res = false;
                }
                finally
                {
                    if (fs != null)
                    {
                        fs.Close();
                        fs = null;
                    }
                    if (entry != null)
                    {
                        entry = null;
                    }
                    GC.Collect();
                    GC.Collect(1);
                }
                folders = Directory.GetDirectories(FolderToZip);
                foreach (string folder in folders)
                {
                    if (!ZipFileDictory(folder, s, Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip))))
                    {
                        return false;
                    }
                }
                return res;
            }
    
            /// <summary>
            /// 压缩目录
            /// </summary>
            /// <param name="FolderToZip">待压缩的文件夹,全路径格式</param>
            /// <param name="ZipedFile">压缩后的文件名,全路径格式</param>
            private static bool ZipFileDictory(string FolderToZip, string ZipedFile, int level)
            {
                bool res;
                if (!Directory.Exists(FolderToZip))
                {
                    return false;
                }
                ZipOutputStream s = new ZipOutputStream(File.Create(ZipedFile));
                s.SetLevel(level);
                res = ZipFileDictory(FolderToZip, s, "");
                s.Finish();
                s.Close();
                return res;
            }
    
            /// <summary>
            /// 压缩文件
            /// </summary>
            /// <param name="FileToZip">要进行压缩的文件名</param>
            /// <param name="ZipedFile">压缩后生成的压缩文件名</param>
            private static bool ZipFile(string FileToZip, string ZipedFile, int level)
            {
                if (!File.Exists(FileToZip))
                {
                    throw new System.IO.FileNotFoundException("指定要压缩的文件: " + FileToZip + " 不存在!");
                }
                FileStream ZipFile = null;
                ZipOutputStream ZipStream = null;
                ZipEntry ZipEntry = null;
                bool res = true;
                try
                {
                    ZipFile = File.OpenRead(FileToZip);
                    byte[] buffer = new byte[ZipFile.Length];
                    ZipFile.Read(buffer, 0, buffer.Length);
                    ZipFile.Close();
    
                    ZipFile = File.Create(ZipedFile);
                    ZipStream = new ZipOutputStream(ZipFile);
                    ZipEntry = new ZipEntry(Path.GetFileName(FileToZip));
                    ZipStream.PutNextEntry(ZipEntry);
                    ZipStream.SetLevel(level);
    
                    ZipStream.Write(buffer, 0, buffer.Length);
                }
                catch
                {
                    res = false;
                }
                finally
                {
                    if (ZipEntry != null)
                    {
                        ZipEntry = null;
                    }
                    if (ZipStream != null)
                    {
                        ZipStream.Finish();
                        ZipStream.Close();
                    }
                    if (ZipFile != null)
                    {
                        ZipFile.Close();
                        ZipFile = null;
                    }
                    GC.Collect();
                    GC.Collect(1);
                }
                return res;
            }
            #endregion
    
            /// <summary>
            /// 压缩
            /// </summary>
            /// <param name="FileToZip">待压缩的文件目录</param>
            /// <param name="ZipedFile">生成的目标文件</param>
            /// <param name="level">6</param>
            public static bool Zip(String FileToZip, String ZipedFile, int level)
            {
                if (Directory.Exists(FileToZip))
                {
                    return ZipFileDictory(FileToZip, ZipedFile, level);
                }
                else if (File.Exists(FileToZip))
                {
                    return ZipFile(FileToZip, ZipedFile, level);
                }
                else
                {
                    return false;
                }
            }
    
            /// <summary>
            /// 解压
            /// </summary>
            /// <param name="FileToUpZip">待解压的文件</param>
            /// <param name="ZipedFolder">解压目标存放目录</param>
            public static void UnZip(string FileToUpZip, string ZipedFolder)
            {
                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));
                    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;
                                }
                            }
                        }
                    }
                }
                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);
                }
            }
        }
    
        public class ZipHelper
        {
            #region 私有变量
            String the_rar;
            RegistryKey the_Reg;
            Object the_Obj;
            String the_Info;
            ProcessStartInfo the_StartInfo;
            Process the_Process;
            #endregion
    
            /// <summary>
            /// 压缩
            /// </summary>
            /// <param name="zipname">要解压的文件名</param>
            /// <param name="zippath">要压缩的文件目录</param>
            /// <param name="dirpath">初始目录</param>
            public void EnZip(string zipname, string zippath, string dirpath)
            {
                try
                {
                    the_Reg = Registry.ClassesRoot.OpenSubKey(@"Applications\WinRAR.exe\Shell\Open\Command");
                    the_Obj = the_Reg.GetValue("");
                    the_rar = the_Obj.ToString();
                    the_Reg.Close();
                    the_rar = the_rar.Substring(1, the_rar.Length - 7);
                    the_Info = " a    " + zipname + "  " + zippath;
                    the_StartInfo = new ProcessStartInfo();
                    the_StartInfo.FileName = the_rar;
                    the_StartInfo.Arguments = the_Info;
                    the_StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                    the_StartInfo.WorkingDirectory = dirpath;
                    the_Process = new Process();
                    the_Process.StartInfo = the_StartInfo;
                    the_Process.Start();
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
    
            /// <summary>
            /// 解压缩
            /// </summary>
            /// <param name="zipname">要解压的文件名</param>
            /// <param name="zippath">要解压的文件路径</param>
            public void DeZip(string zipname, string zippath)
            {
                try
                {
                    the_Reg = Registry.ClassesRoot.OpenSubKey(@"Applications\WinRar.exe\Shell\Open\Command");
                    the_Obj = the_Reg.GetValue("");
                    the_rar = the_Obj.ToString();
                    the_Reg.Close();
                    the_rar = the_rar.Substring(1, the_rar.Length - 7);
                    the_Info = " X " + zipname + " " + zippath;
                    the_StartInfo = new ProcessStartInfo();
                    the_StartInfo.FileName = the_rar;
                    the_StartInfo.Arguments = the_Info;
                    the_StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                    the_Process = new Process();
                    the_Process.StartInfo = the_StartInfo;
                    the_Process.Start();
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
        }
    }

    使用也非常 的简单如下
    [C#] 纯文本查看 复制代码
      //这是将目录 a压缩后存放为D:\\a.zip
                SharpZip.PackFiles("D:\\a.zip", "D:\\a");
    
                //这是将文件a.zip解压缩为D:\\a
                SharpZip.UnpackFiles("D:\\a.zip", "D:\\a");

    好了大家下载测试一下吧,有什么问题可以直接跟帖

  • TA的每日心情
    无聊
    2018-1-24 10:43
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    发表于 2014-1-16 09:19:27 | 显示全部楼层

    该用户从未签到

    发表于 2014-4-17 14:42:39 | 显示全部楼层

    该用户从未签到

    发表于 2014-7-6 20:36:12 | 显示全部楼层

    该用户从未签到

    发表于 2014-7-8 13:32:00 | 显示全部楼层

    该用户从未签到

    发表于 2015-3-24 00:30:12 | 显示全部楼层

    该用户从未签到

    发表于 2015-10-8 16:40:31 | 显示全部楼层
    您需要登录后才可以回帖 登录 | 马上注册

    本版积分规则

    QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备17001017号-1 )

    GMT+8, 2018-10-19 04:02

    © 2017-2018

    快速回复 返回顶部 返回列表