zoukankan      html  css  js  c++  java
  • 《ICSharpCode快速解压缩帮助类》——即粘即用

    在项目中往往使用解压缩公共类,解压缩之后的文件占用空间小,也可进行加密,往往可以用于客户端上传附件,打包输出主程序等,其中的好处就不多说了,最近着手的项目中多次使用到了解压缩方法,现较流行的就是ICSharpCode,稳定,高效,是一个不错的解压缩封装类。通过InterNET和个人的整理,现将该类分享出来,作为资源分享给大家,这样就可以不用在埋头苦脑的在InterNET上苦苦寻找了,废话不多说,上代码:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.IO;
      4 using System.Security.Cryptography;
      5 using ICSharpCode.SharpZipLib.Core;
      6 using ICSharpCode.SharpZipLib.Zip;
      7 
      8 namespace Helper
      9 {
     10     public class Utily
     11     {
     12         /// <summary>
     13         /// 快速压缩
     14         /// </summary>
     15         /// <param name="filesPath">需要压缩的文件夹路径</param>
     16         /// <param name="zipFilePath">输出路径</param>
     17         /// <param name="pwd">密码,可不写</param>
     18         /// <param name="fileFilter">过滤条件</param>
     19         /// <param name="CreateEmptyDirectories">是否压缩空文件夹</param>
     20         /// <param name="progressFun">处理进程</param>
     21         /// <param name="seconds">触发的秒数</param>
     22         /// <param name="completeFun">完成事件</param>
     23         public static void CreateZipFile(string filesPath, string zipFilePath, string pwd, string fileFilter, bool CreateEmptyDirectories, ProgressHandler progressFun, double seconds, CompletedFileHandler completeFun)
     24         {
     25             FastZipEvents events = new FastZipEvents();
     26             if (progressFun != null)
     27             {
     28                 events.Progress = progressFun;
     29                 events.ProgressInterval = TimeSpan.FromSeconds(seconds);
     30             }
     31             if (completeFun != null)
     32             {
     33                 events.CompletedFile = completeFun;
     34             }
     35             FastZip zip = new FastZip(events);
     36             zip.CreateEmptyDirectories = CreateEmptyDirectories;
     37             if (!string.IsNullOrEmpty(pwd))
     38                 zip.Password = pwd;
     39             zip.UseZip64 = UseZip64.On;
     40             zip.RestoreAttributesOnExtract = true;
     41             zip.RestoreDateTimeOnExtract = true;
     42             zip.CreateZip(zipFilePath, filesPath, true, fileFilter);
     43         }
     44 
     45         /// <summary>
     46         /// 快速解压
     47         /// </summary>
     48         /// <param name="zipFilePath">压缩文件路径</param>
     49         /// <param name="extractPath">解压路径</param>
     50         /// <param name="pwd">压缩密码</param>
     51         /// <param name="progressFun">进程</param>
     52         /// <param name="seconds">触发时间</param>
     53         public static void ExtractZipFile(string zipFilePath, string extractPath, string pwd, ProgressHandler progressFun, double seconds)
     54         {
     55             FastZipEvents events = new FastZipEvents();
     56             if (progressFun != null)
     57             {
     58                 events.Progress = progressFun;
     59                 events.ProgressInterval = TimeSpan.FromSeconds(seconds);
     60             }
     61             FastZip zip = new FastZip(events);
     62 
     63             zip.CreateEmptyDirectories = true;
     64             if (!string.IsNullOrEmpty(pwd))
     65                 zip.Password = pwd;
     66             zip.UseZip64 = UseZip64.On;
     67             zip.RestoreAttributesOnExtract = true;
     68             zip.RestoreDateTimeOnExtract = true;
     69             zip.ExtractZip(zipFilePath, extractPath, FastZip.Overwrite.Always, null, "", "", true);
     70         }
     71 
     72         /// <summary>
     73         /// 快速解压
     74         /// </summary>
     75         /// <param name="zipFilePath">压缩文件路径</param>
     76         /// <param name="extractPath">解压路径</param>
     77         /// <param name="pwd">密码</param>
     78         /// <param name="progressFun">进程</param>
     79         /// <param name="seconds">触发时间</param>
     80         /// <param name="completeFun">压缩过程中执行的函数</param>
     81         public static void ExtractZipFile(string zipFilePath, string extractPath, string pwd, ProgressHandler progressFun, double seconds, CompletedFileHandler completeFun)
     82         {
     83             FastZipEvents events = new FastZipEvents();
     84             if (progressFun != null)
     85             {
     86                 events.Progress = progressFun;
     87                 events.ProgressInterval = TimeSpan.FromSeconds(seconds);
     88             }
     89             if (completeFun != null)
     90             {
     91                 events.CompletedFile = completeFun;
     92             }
     93             FastZip zip = new FastZip(events);
     94 
     95             zip.CreateEmptyDirectories = true;
     96             if (!string.IsNullOrEmpty(pwd))
     97                 zip.Password = pwd;
     98             zip.UseZip64 = UseZip64.On;
     99             zip.RestoreAttributesOnExtract = true;
    100             zip.RestoreDateTimeOnExtract = true;
    101             zip.ExtractZip(zipFilePath, extractPath, FastZip.Overwrite.Always, null, "", "", true);
    102         }
    103 
    104         /// <summary>
    105         /// 获得压缩包内原文件总大小
    106         /// </summary>
    107         /// <param name="fileName"></param>
    108         /// <param name="fileFilter"></param>
    109         /// <param name="directoryFilter"></param>
    110         /// <returns></returns>
    111         public static long GetZipFileSize(string fileName, string fileFilter, string directoryFilter)
    112         {
    113             long b = 0;
    114             using (ZipFile zipFile = new ZipFile(fileName))
    115             {
    116                 PathFilter localFileFilter = new PathFilter(fileFilter);
    117                 PathFilter localDirFilter = new PathFilter(directoryFilter);
    118 
    119                 if (zipFile.Count == 0)
    120                 {
    121                     return 0;
    122                 }
    123                 for (int i = 0; i < zipFile.Count; ++i)
    124                 {
    125                     ZipEntry e = zipFile[i];
    126                     if (e.IsFile)
    127                     {
    128                         string path = Path.GetDirectoryName(e.Name);
    129                         if (localDirFilter.IsMatch(path))
    130                         {
    131                             if (localFileFilter.IsMatch(Path.GetFileName(e.Name)))
    132                             {
    133                                 b += e.Size;
    134                             }
    135                         }
    136                     }
    137                 }
    138             }
    139             return b;
    140         }
    141 
    142         /// <summary>
    143         /// 获得MD5校验码
    144         /// </summary>
    145         /// <param name="filepath"></param>
    146         /// <returns></returns>
    147         public static string GetMD5(string filepath)
    148         {
    149             string returnStr = "";
    150             FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);
    151             MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
    152             byte[] md5byte = md5.ComputeHash(fs);
    153             int i, j;
    154             foreach (byte b in md5byte)
    155             {
    156                 i = Convert.ToInt32(b);
    157                 j = i >> 4;
    158                 returnStr += Convert.ToString(j, 16);
    159                 j = ((i << 4) & 0x00ff) >> 4;
    160                 returnStr += Convert.ToString(j, 16);
    161             }
    162             fs.Dispose();
    163             return returnStr;
    164         }
    165 
    166         /// <summary>
    167         /// 解压缩特定文件名的文件
    168         /// </summary>
    169         /// <param name="path">文件路径</param>
    170         /// <param name="addres">解压缩路径</param>
    171         /// <param name="zipFileName">文件名称</param>
    172         /// <param name="pwd">解压缩包密码</param>
    173         public static void ZipToFile(string path, string addres, string zipFileName, string pwd)
    174         {
    175             ZipInputStream ZipStream = new ZipInputStream(System.IO.File.OpenRead(path));
    176             if (!string.IsNullOrEmpty(pwd))
    177                 ZipStream.Password = pwd;
    178             ZipEntry fileEntry;
    179             while ((fileEntry = ZipStream.GetNextEntry()) != null)
    180             {
    181                 string filename = Path.GetFileName(fileEntry.Name);
    182                 if (filename == zipFileName)
    183                 {
    184                     filename = addres + "\" + filename;
    185                     FileStream streamWriter = System.IO.File.Create(filename);
    186                     int size = (int)fileEntry.Size;
    187                     byte[] buffer = new byte[size];
    188 
    189                     size = ZipStream.Read(buffer, 0, size);
    190                     streamWriter.Write(buffer, 0, size);
    191                     streamWriter.Close();
    192                 }
    193             }
    194             ZipStream.Close();
    195         }
    196     }
    197 }

    该类能够满足基本常用解压缩的方法了,不过现比较流行的应该是7z压缩,这个也在研究中,以上代码若有不正确的地方,也请各位大牛指正。至于ICSharpCode的DLL文件,网上能够下载的地方也很多,我也就不在给出下载地址了。

    温馨提醒:在引用ICSharpCode时记的在调用此类方法的类库或应用程序上也要引用ICSharpCode,否则会产生错误。

    今天就分享这么多吧。

    版权声明:

      本文由Tom原创并发布于博客园,欢迎转载,未经本人同意必须保留此段声明(否则保留追究责任的权利),且在文章页面明显位置给出原文链接,如有问题,可以通过419187544@qq.com 联系我,非常感谢。

  • 相关阅读:
    哥们儿太猛了
    word文档中出现一串乱码数字
    outlook添加附件时报错--“附件大小超过了允许的范围”
    windows常用脚本备忘
    vim常用命令
    win10中使用scp命令传输文件
    win10安装域控管理工具组件
    edge浏览器离线下载
    SQL_从星期一到星期六自动打卡SQL代码
    用友U8按BOM计算销售订单物料需求SQL代码 第一稿
  • 原文地址:https://www.cnblogs.com/doNetTom/p/3638227.html
Copyright © 2011-2022 走看看