• 【C#】依赖于SharpZipLib的Zip压缩工具类


      上班第二天下班,课外作业,实现一个ZIP压缩的工具类.本来想用Package,但是写完了才发现不能解压其他工具压缩的zip包,比较麻烦,因此本工具类依赖了第三方的库(SharpZipLib  version 0.86.0 http://icsharpcode.github.io/SharpZipLib/),上午花了两个小时整理了下代码,mark下!

      

     1 /**
     2  * Class: ZIP压缩工具类
     3  * Reference: SharpZipLib  version 0.86.0 (http://icsharpcode.github.io/SharpZipLib/)
     4  * Author: Zengyq
     5  * Version: 1.0
     6  * Create Date: 2014-05-13
     7  * Modified Date: 2014-05-14
     8  */
     9 
    10 /****************构造函数*************************/
    11 ZipUtils()
    12 ZipUtils(int compressionLevel)
    13 
    14 /****************方法列表*************************/
    15 /// <summary>
    16 /// 功能: ZIP方式压缩文件(压缩目录)
    17 /// </summary>
    18 /// <param name="dirPath">被压缩的文件夹夹路径</param>
    19 /// <param name="zipFilePath">生成压缩文件的路径,缺省值:文件夹名+.zip</param>
    20 /// <param name="msg">返回消息</param>
    21 /// <returns>是否压缩成功</returns>
    22 public bool ZipFolder(string dirPath, string zipFilePath, out string msg)
    23 
    24 /// <summary>
    25 /// 功能:压缩文件指定文件
    26 /// </summary>
    27 /// <param name="filenames">要压缩文件的绝对路径</param>
    28 /// <param name="zipFilePath">生成压缩文件的路径, 缺省值为随机数字串.zip</param>
    29 /// <param name="msg">返回消息</param>
    30 /// <returns>是否压缩成功</returns>
    31 public bool ZipFiles(string[] filenames, string zipFilePath, out string msg)
    32 
    33 /// <summary>
    34 /// 解压ZIP格式的文件。
    35 /// </summary>
    36 /// <param name="zipFilePath">压缩文件路径</param>
    37 /// <param name="unZipDir">解压文件存放路径,缺省值压缩文件同一级目录下,跟压缩文件同名的文件夹</param>
    38 /// <param name="msg">返回消息</param>
    39 /// <returns>解压是否成功</returns>
    40 public bool UnZipFile(string zipFilePath, string unZipDir, out string msg)
    41 
    42 /// <summary>
    43 /// 解压指定ZIP文件到当前路径
    44 /// </summary>
    45 /// <param name="zipFilePath">ZIP文件绝对路径</param>
    46 /// <param name="msg">返回消息</param>
    47 /// <returns>解压是否成功</returns>
    48 public bool UnZipFileToCurrentPath(string zipFilePath, out string msg)
    49 
    50 /****************调用样例*************************/
    51 ZipUtils zu = new ZipUtils(); 
    52 string msg = "";
    53 zu.UnZipFileToCurrentPath(@"C:UserszengyiqunDesktoppackage1024.zip", out msg);

      类实现,没有采用静态类的形式,看了某博客用了out作为msg不懂会不会用到,先这样了,以下是实现类:

      1 /**
      2  * Class: ZIP压缩工具类
      3  * Reference: SharpZipLib  version 0.86.0 (http://icsharpcode.github.io/SharpZipLib/)
      4  * Author: Zengyq
      5  * Version: 1.0
      6  * Create Date: 2014-05-13
      7  * Modified Date: 2014-05-14
      8  */
      9 
     10 using ICSharpCode.SharpZipLib.Zip;
     11 using System;
     12 using System.IO;
     13 
     14 public class ZipUtils
     15 {
     16     //缓存大小
     17     private int BufferSize;
     18 
     19     //压缩率 0(无压缩)-9(压缩率最高)
     20     private int CompressionLevel;
     21 
     22     //压缩是用于存放压缩路径
     23     private string CompressPath;
     24 
     25 
     26     #region 构造函数
     27     /// <summary>
     28     /// 无参构造
     29     /// </summary>
     30     public ZipUtils()
     31     {
     32         this.BufferSize = 4096;
     33         this.CompressionLevel = 9;
     34     }
     35 
     36     /// <summary>
     37     /// 带参数构造
     38     /// </summary>
     39     /// <param name="compressionLevel">0(无压缩)-9(压缩率最高)</param>
     40     public ZipUtils(int compressionLevel)
     41     {
     42         this.BufferSize = 4096;
     43         this.CompressionLevel = compressionLevel;
     44     }
     45     #endregion
     46 
     47     #region 压缩方法
     48     /// <summary>
     49     /// 功能: ZIP方式压缩文件(压缩目录)
     50     /// </summary>
     51     /// <param name="dirPath">被压缩的文件夹夹路径</param>
     52     /// <param name="zipFilePath">生成压缩文件的路径,缺省值:文件夹名+.zip</param>
     53     /// <param name="msg">返回消息</param>
     54     /// <returns>是否压缩成功</returns>
     55     public bool ZipFolder(string dirPath, string zipFilePath, out string msg)
     56     {
     57         this.CompressPath = dirPath;
     58         //判断目录是否为空
     59         if (dirPath == string.Empty)
     60         {
     61             msg = "The Folder is empty";
     62             return false;
     63         }
     64 
     65         //判断目录是否存在
     66         if (!Directory.Exists(dirPath))
     67         {
     68             msg = "The Folder is not exists";
     69             return false;
     70         }
     71 
     72         //压缩文件名为空时使用 文件夹名.zip
     73         if (zipFilePath == string.Empty || zipFilePath == null)
     74         {
     75             if (dirPath.EndsWith("//"))
     76             {
     77                 dirPath = dirPath.Substring(0, dirPath.Length - 1);
     78             }
     79             zipFilePath = dirPath + ".zip";
     80         }
     81 
     82         try
     83         {
     84             using (ZipOutputStream s = new ZipOutputStream(File.Create(zipFilePath)))
     85             {
     86                 s.SetLevel(this.CompressionLevel);
     87                 ZipDirectory(dirPath, s);//压缩目录,包含子目录
     88                 s.Finish();
     89                 s.Close();
     90             }
     91         }
     92         catch (Exception ex)
     93         {
     94             msg = ex.Message;
     95             return false;
     96         }
     97 
     98         msg = "Success";
     99         return true;
    100     }//end function
    101 
    102     /// <summary>
    103     /// 压缩文件指定文件
    104     /// </summary>
    105     /// <param name="filenames">要压缩文件的绝对路径</param>
    106     /// <param name="zipFilePath">生成压缩文件的路径, 缺省值为当前时间.zip</param>
    107     /// <param name="msg">返回消息</param>
    108     /// <returns>是否压缩成功</returns>
    109     public bool ZipFiles(string[] filenames, string zipFilePath, out string msg)
    110     {
    111         msg = "";
    112         if (filenames.Length == 0)
    113         {
    114             msg = "No File Selected";
    115             return false;
    116         }
    117 
    118         //压缩文件名为空时使用 文件夹名.zip
    119         if (zipFilePath == string.Empty || zipFilePath == null)
    120         {
    121             zipFilePath = System.Environment.CurrentDirectory + "\" + DateTime.Now.ToFileTimeUtc().ToString() + ".zip";
    122         }
    123 
    124         try
    125         {
    126             using (ZipOutputStream s = new ZipOutputStream(File.Create(zipFilePath)))
    127             {
    128                 s.SetLevel(this.CompressionLevel);
    129                 ZipFilesAndDirectory(filenames,s);
    130                 s.Finish();
    131                 s.Close();
    132             }//end using
    133         }
    134         catch (Exception ex)
    135         {
    136             msg = ex.Message;
    137             return false;
    138         }
    139 
    140         msg = "Success";
    141         return true;
    142     }
    143 
    144     #endregion
    145 
    146     #region 解压方法
    147     /// <summary>
    148     /// 解压ZIP格式的文件。
    149     /// </summary>
    150     /// <param name="zipFilePath">压缩文件路径</param>
    151     /// <param name="unZipDir">解压文件存放路径,缺省值压缩文件同一级目录下,跟压缩文件同名的文件夹</param>
    152     /// <param name="msg">返回消息</param>
    153     /// <returns>解压是否成功</returns>
    154     public bool UnZipFile(string zipFilePath, string unZipDir, out string msg)
    155     {
    156         msg = "";
    157 
    158         //判读路径是否为空
    159         if (zipFilePath == string.Empty || zipFilePath == null)
    160         {
    161             msg = "ZipFile No Selected";
    162             return false;
    163         }
    164 
    165         //判读文件是否存在
    166         if (!File.Exists(zipFilePath))
    167         {
    168             msg = "ZipFile No Exists";
    169             return false;
    170         }
    171         //解压文件夹为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹
    172         if (unZipDir == string.Empty || unZipDir == null)
    173         {
    174             unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath));
    175         }
    176 
    177         if (!unZipDir.EndsWith("//")) 
    178         {
    179             unZipDir += "//";
    180         }
    181             
    182         if (!Directory.Exists(unZipDir))
    183         {
    184             Directory.CreateDirectory(unZipDir);
    185         }
    186 
    187         try
    188         {
    189             using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath)))
    190             {
    191 
    192                 ZipEntry theEntry;
    193                 while ((theEntry = s.GetNextEntry()) != null)
    194                 {
    195                     string directoryName = Path.GetDirectoryName(theEntry.Name);
    196                     string fileName = Path.GetFileName(theEntry.Name);
    197                     if (directoryName.Length > 0)
    198                     {
    199                         Directory.CreateDirectory(unZipDir + directoryName);
    200                     }
    201                     if (!directoryName.EndsWith("//"))
    202                     { 
    203                         directoryName += "//";
    204                     }
    205                     if (fileName != String.Empty && fileName != null)
    206                     {
    207                         using (FileStream streamWriter = File.Create(unZipDir + theEntry.Name))
    208                         {
    209                             CopyStream(s, streamWriter);
    210                         }
    211                     }
    212                 }//end while
    213             }//end using
    214         }
    215         catch (Exception ex)
    216         {
    217             msg = ex.Message;
    218             return false;
    219         }
    220 
    221         msg = "UnZip Success ! ";
    222         return true;
    223     }//end function
    224 
    225     /// <summary>
    226     /// 解压指定ZIP文件到当前路径
    227     /// </summary>
    228     /// <param name="zipFilePath">ZIP文件绝对路径</param>
    229     /// <param name="msg">返回消息</param>
    230     /// <returns>解压是否成功</returns>
    231     public bool UnZipFileToCurrentPath(string zipFilePath, out string msg)
    232     {
    233         msg = "";
    234 
    235         //判读路径是否为空
    236         if (zipFilePath == string.Empty || zipFilePath == null)
    237         {
    238             msg = "ZipFile No Selected";
    239             return false;
    240         }
    241 
    242         //判读文件是否存在
    243         if (!File.Exists(zipFilePath))
    244         {
    245             msg = "ZipFile No Exists";
    246             return false;
    247         }
    248         //解压到当前目录
    249         string unZipDir = zipFilePath.Substring(0, zipFilePath.LastIndexOf(@""));
    250 
    251         if (!unZipDir.EndsWith("//"))
    252         {
    253             unZipDir += "//";
    254         }
    255 
    256         if (!Directory.Exists(unZipDir))
    257         {
    258             Directory.CreateDirectory(unZipDir);
    259         }
    260 
    261         try
    262         {
    263             using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath)))
    264             {
    265                 ZipEntry theEntry;
    266                 while ((theEntry = s.GetNextEntry()) != null)
    267                 {
    268                     string directoryName = Path.GetDirectoryName(theEntry.Name);
    269                     string fileName = Path.GetFileName(theEntry.Name);
    270                     if (directoryName.Length > 0)
    271                     {
    272                         Directory.CreateDirectory(unZipDir + directoryName);
    273                     }
    274                     if (!directoryName.EndsWith("//"))
    275                     {
    276                         directoryName += "//";
    277                     }
    278                     if (fileName != String.Empty && fileName != null)
    279                     {
    280                         using (FileStream streamWriter = File.Create(unZipDir + theEntry.Name))
    281                         {
    282                             CopyStream(s, streamWriter);
    283                         }
    284                     }
    285                 }//end while
    286             }//end using
    287         }
    288         catch (Exception ex)
    289         {
    290             msg = ex.Message;
    291             return false;
    292         }
    293 
    294         msg = "UnZip Success ! ";
    295         return true;
    296     }//end function
    297 
    298     #endregion
    299 
    300     #region 内部方法
    301 
    302     /// <summary>
    303     /// 内部类:递归压缩目录
    304     /// </summary>
    305     /// <param name="dirPath"></param>
    306     /// <param name="s"></param>
    307     private void ZipDirectory(string dirPath, ZipOutputStream s)
    308     {
    309         string[] filenames = Directory.GetFiles(dirPath);
    310         byte[] buffer = new byte[this.BufferSize];
    311         foreach (string file in filenames)
    312         {
    313             //处理相对路径问题
    314             ZipEntry entry = new ZipEntry(file.Replace(this.CompressPath + "\", String.Empty));
    315             //设置压缩时间
    316             entry.DateTime = DateTime.Now;
    317 
    318             s.PutNextEntry(entry);
    319             using (FileStream fs = File.OpenRead(file))
    320             {
    321                 CopyStream(fs, s);
    322             }
    323         }
    324 
    325         //递归处理子目录
    326         DirectoryInfo di = new DirectoryInfo(dirPath);
    327         foreach (DirectoryInfo subDi in di.GetDirectories())
    328         {
    329             ZipDirectory(subDi.FullName, s);
    330         }
    331 
    332     }//end function
    333 
    334     /// <summary>
    335     /// 
    336     /// </summary>
    337     /// <param name="filenames"></param>
    338     /// <param name="s"></param>
    339     private void ZipFilesAndDirectory(string[] filenames, ZipOutputStream s)
    340     {
    341         byte[] buffer = new byte[this.BufferSize];
    342         foreach (string file in filenames)
    343         {
    344             //当时文件的时候
    345             if (System.IO.File.Exists(file))
    346             {
    347                 ZipEntry entry = new ZipEntry(Path.GetFileName(file));
    348                 entry.DateTime = DateTime.Now;
    349                 s.PutNextEntry(entry);
    350                 using (FileStream fs = File.OpenRead(file))
    351                 {
    352                     CopyStream(fs, s);
    353                 }
    354             }
    355 
    356             //当时目录的时候
    357             if(System.IO.Directory.Exists(file))
    358             {
    359                 this.CompressPath = file.Replace("\" + Path.GetFileName(file),String.Empty);
    360                 ZipDirectory(file, s);
    361             }
    362 
    363         }
    364 
    365        
    366     }
    367 
    368 
    369 
    370     /// <summary>
    371     /// 按块复制
    372     /// </summary>
    373     /// <param name="source">源Stream</param>
    374     /// <param name="target">目标Stream</param>
    375     private void CopyStream(Stream source, Stream target)
    376     {
    377         byte[] buf = new byte[this.BufferSize];
    378         int byteRead = 0;
    379         while ((byteRead = source.Read(buf, 0, this.BufferSize)) > 0)
    380         {
    381             target.Write(buf, 0, byteRead);
    382         }
    383 
    384     }
    385     #endregion
    386 
    387 }//end class

      代码风格还请大家轻喷,在.net程序员面前是个非主流java程序员,在java程序员面前是个非主流.net程序员。将以上工具类封装成了dll可以直接引用。

      附件:ZipUtils.rar

    1 ZipUtils.rar
    2     -src
    3         -ZipUtils.cs
    4     -dll
    5         -SharpZipLib.dll
    6         -ZipUtilsLib.dll
  • 相关阅读:
    Hive on Spark
    Mongodb添加副本及修改优先级
    RabbitMQ与Spring集成
    最简单的图文教程,几步完成Git的公私钥配置
    Idea Ant 打开发包
    Spring Web 项目Junit测试报错问题
    阿里云maven仓库地址,速度提升100倍
    Spring boot 学习
    JAVA开发常用工具包
    从无到有搭建SSM框架
  • 原文地址:https://www.cnblogs.com/zengyiqun/p/3728507.html
Copyright © 2020-2023  润新知