• ZipHelper


    本文只列举一个压缩帮助类,使用的是有要添加一个dll引用ICSharpCode.SharpZipLib.dll。另外说明一下的是,这个类压缩格式是ZIP的,所以文件的后缀写成 .zip

    还有,如果用这个类来解压rar格式的压缩文件时会报错,就网上说的那个"Wrong Local header signature: 0x21726152"异常。只要解压ZIP压缩格式的压缩文件就不会报错了。 下面就是Helper类的代码

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.IO;
      6 using ICSharpCode.SharpZipLib;
      7 using ICSharpCode.SharpZipLib.Zip;
      8 using ICSharpCode.SharpZipLib.Checksums;
      9 
     10 namespace MyHelpers.Helpers
     11 {
     12     /// <summary>
     13     /// 适用与ZIP压缩
     14     /// </summary>
     15     public class ZipHelper
     16     {
     17         #region 压缩
     18 
     19         /// <summary>
     20         /// 递归压缩文件夹的内部方法
     21         /// </summary>
     22         /// <param name="folderToZip">要压缩的文件夹路径</param>
     23         /// <param name="zipStream">压缩输出流</param>
     24         /// <param name="parentFolderName">此文件夹的上级文件夹</param>
     25         /// <returns></returns>
     26         private static bool ZipDirectory(string folderToZip, ZipOutputStream zipStream, string parentFolderName)
     27         {
     28             bool result = true;
     29             string [] folders, files;
     30             ZipEntry ent = null;
     31             FileStream fs = null;
     32             Crc32 crc = new Crc32();
     33 
     34             try
     35             {
     36                 ent = new ZipEntry(Path.Combine(parentFolderName, Path.GetFileName(folderToZip) + "/"));
     37                 zipStream.PutNextEntry(ent);
     38                 zipStream.Flush();
     39 
     40                 files = Directory.GetFiles(folderToZip);
     41                 foreach (string file in files)
     42                 {
     43                     fs = File.OpenRead(file);
     44 
     45                     byte[] buffer = new byte[fs.Length];
     46                     fs.Read(buffer, 0, buffer.Length);
     47                     ent = new ZipEntry(Path.Combine(parentFolderName, Path.GetFileName(folderToZip) + "/" + Path.GetFileName(file)));
     48                     ent.DateTime = DateTime.Now;
     49                     ent.Size = fs.Length;
     50 
     51                     fs.Close();
     52 
     53                     crc.Reset();
     54                     crc.Update(buffer);
     55 
     56                     ent.Crc = crc.Value;
     57                     zipStream.PutNextEntry(ent);
     58                     zipStream.Write(buffer, 0, buffer.Length);
     59                 }
     60 
     61             }
     62             catch
     63             {
     64                 result = false;
     65             }
     66             finally
     67             {
     68                 if (fs != null)
     69                 {
     70                     fs.Close();
     71                     fs.Dispose();
     72                 }
     73                 if (ent != null)
     74                 {
     75                     ent = null;
     76                 }
     77                 GC.Collect();
     78                 GC.Collect(1);
     79             }
     80 
     81             folders = Directory.GetDirectories(folderToZip);
     82             foreach (string folder in folders)
     83                 if (!ZipDirectory(folder, zipStream, folderToZip))
     84                     return false;
     85 
     86             return result;
     87         }
     88 
     89         /// <summary>
     90         /// 压缩文件夹 
     91         /// </summary>
     92         /// <param name="folderToZip">要压缩的文件夹路径</param>
     93         /// <param name="zipedFile">压缩文件完整路径</param>
     94         /// <param name="password">密码</param>
     95         /// <returns>是否压缩成功</returns>
     96         public static bool ZipDirectory(string folderToZip, string zipedFile, string password)
     97         {
     98             bool result = false;
     99             if (!Directory.Exists(folderToZip))
    100                 return result;
    101 
    102             ZipOutputStream zipStream = new ZipOutputStream(File.Create(zipedFile));
    103             zipStream.SetLevel(6);
    104             if (!string.IsNullOrEmpty(password)) zipStream.Password = password;
    105 
    106             result = ZipDirectory(folderToZip, zipStream, "");
    107 
    108             zipStream.Finish();
    109             zipStream.Close();
    110 
    111             return result;
    112         }
    113 
    114         /// <summary>
    115         /// 压缩文件夹
    116         /// </summary>
    117         /// <param name="folderToZip">要压缩的文件夹路径</param>
    118         /// <param name="zipedFile">压缩文件完整路径</param>
    119         /// <returns>是否压缩成功</returns>
    120         public static bool ZipDirectory(string folderToZip, string zipedFile)
    121         {
    122             bool result = ZipDirectory(folderToZip, zipedFile, null);
    123             return result;
    124         }
    125 
    126         /// <summary>
    127         /// 压缩文件
    128         /// </summary>
    129         /// <param name="fileToZip">要压缩的文件全名</param>
    130         /// <param name="zipedFile">压缩后的文件名</param>
    131         /// <param name="password">密码</param>
    132         /// <returns>压缩结果</returns>
    133         public static bool ZipFile(string fileToZip, string zipedFile, string password)
    134         {
    135             bool result = true;
    136             ZipOutputStream zipStream=null;
    137             FileStream fs = null;
    138             ZipEntry ent = null;
    139 
    140             if (!File.Exists(fileToZip))
    141                 return false;
    142 
    143             try
    144             {
    145                 fs = File.OpenRead(fileToZip);
    146                 byte[] buffer = new byte[fs.Length];
    147                 fs.Read(buffer, 0, buffer.Length);
    148                 fs.Close();
    149 
    150                 fs = File.Create(zipedFile);
    151                 zipStream = new ZipOutputStream(fs);
    152                 if (!string.IsNullOrEmpty(password)) zipStream.Password = password;
    153                 ent = new ZipEntry(Path.GetFileName(fileToZip));
    154                 zipStream.PutNextEntry(ent);
    155                 zipStream.SetLevel(6);
    156 
    157                 zipStream.Write(buffer, 0, buffer.Length);
    158 
    159             }
    160             catch
    161             {
    162                 result = false;
    163             }
    164             finally
    165             {
    166                 if (zipStream != null)
    167                 {
    168                     zipStream.Finish();
    169                     zipStream.Close();
    170                 }
    171                 if (ent != null)
    172                 {
    173                     ent = null;
    174                 }
    175                 if (fs != null)
    176                 {
    177                     fs.Close();
    178                     fs.Dispose();
    179                 }
    180             }
    181             GC.Collect();
    182             GC.Collect(1);
    183 
    184             return result;
    185         }
    186 
    187         /// <summary>
    188         /// 压缩文件
    189         /// </summary>
    190         /// <param name="fileToZip">要压缩的文件全名</param>
    191         /// <param name="zipedFile">压缩后的文件名</param>
    192         /// <returns>压缩结果</returns>
    193         public static bool ZipFile(string fileToZip, string zipedFile)
    194         {
    195             bool result = ZipFile(fileToZip, zipedFile,null);
    196             return result;
    197         }
    198 
    199         /// <summary>
    200         /// 压缩文件或文件夹
    201         /// </summary>
    202         /// <param name="fileToZip">要压缩的路径</param>
    203         /// <param name="zipedFile">压缩后的文件名</param>
    204         /// <param name="password">密码</param>
    205         /// <returns>压缩结果</returns>
    206         public static bool Zip(string fileToZip, string zipedFile, string password)
    207         {
    208             bool result = false;
    209             if (Directory.Exists(fileToZip))
    210                 result = ZipDirectory(fileToZip, zipedFile, password);
    211             else if (File.Exists(fileToZip))
    212                 result = ZipFile(fileToZip, zipedFile,password);
    213 
    214             return result;
    215         }
    216 
    217         /// <summary>
    218         /// 压缩文件或文件夹
    219         /// </summary>
    220         /// <param name="fileToZip">要压缩的路径</param>
    221         /// <param name="zipedFile">压缩后的文件名</param>
    222         /// <returns>压缩结果</returns>
    223         public static bool Zip(string fileToZip, string zipedFile)
    224         {
    225             bool result = Zip(fileToZip, zipedFile,null);
    226             return result;
    227 
    228         }
    229 
    230         #endregion
    231 
    232         #region 解压
    233 
    234         /// <summary>
    235         /// 解压功能(解压压缩文件到指定目录)
    236         /// </summary>
    237         /// <param name="fileToUnZip">待解压的文件</param>
    238         /// <param name="zipedFolder">指定解压目标目录</param>
    239         /// <param name="password">密码</param>
    240         /// <returns>解压结果</returns>
    241         public static bool UnZip(string fileToUnZip, string zipedFolder, string password)
    242         {
    243             bool result = true;
    244             FileStream fs = null;
    245             ZipInputStream zipStream = null;
    246             ZipEntry ent = null;
    247             string fileName;
    248 
    249             if (!File.Exists(fileToUnZip))
    250                 return false;
    251 
    252             if (!Directory.Exists(zipedFolder))
    253                 Directory.CreateDirectory(zipedFolder);
    254 
    255             try
    256             {
    257                 zipStream=new ZipInputStream(File.OpenRead(fileToUnZip));
    258                 if(!string.IsNullOrEmpty(password))zipStream.Password=password;
    259                 while ((ent=zipStream.GetNextEntry())!=null)
    260                 {
    261                     if (!string.IsNullOrEmpty(ent.Name))
    262                     {
    263                         fileName = Path.Combine(zipedFolder, ent.Name);
    264                         fileName = fileName.Replace('/', '\\');//change by Mr.HopeGi
    265 
    266                         if (fileName.EndsWith("\\"))
    267                         {
    268                             Directory.CreateDirectory(fileName);
    269                             continue;
    270                         }
    271 
    272                         fs = File.Create(fileName);
    273                         int size = 2048;
    274                         byte[] data = new byte[size];
    275                         while (true)
    276                         {
    277                             size = fs.Read(data, 0, data.Length);
    278                             if (size > 0)
    279                                 fs.Write(data, 0, data.Length);
    280                             else
    281                                 break;
    282                         }
    283                     }
    284                 }
    285             }
    286             catch
    287             {
    288                 result = false;
    289             }
    290             finally
    291             {
    292                 if (fs != null)
    293                 {
    294                     fs.Close();
    295                     fs.Dispose();
    296                 }
    297                 if (zipStream != null)
    298                 {
    299                     zipStream.Close();
    300                     zipStream.Dispose();
    301                 }
    302                 if(ent!=null)
    303                 {
    304                     ent = null;
    305                 }
    306                 GC.Collect();
    307                 GC.Collect(1);
    308             }
    309             return result;
    310         }
    311 
    312         /// <summary>
    313         /// 解压功能(解压压缩文件到指定目录)
    314         /// </summary>
    315         /// <param name="fileToUnZip">待解压的文件</param>
    316         /// <param name="zipedFolder">指定解压目标目录</param>
    317         /// <returns>解压结果</returns>
    318         public static bool UnZip(string fileToUnZip, string zipedFolder)
    319         {
    320             bool result = UnZip(fileToUnZip, zipedFolder,null);
    321             return result;
    322         }
    323 
    324         #endregion
    325     }
    326 }
  • 相关阅读:
    使用 Facebook开源动画库 POP 实现真实衰减动画
    在命名空间下定义类型
    作为程序猿我给csdn博客加入打赏功能
    linux高可用集群heartbeat实现http的高可用
    杭电 HDU 1247 ACMHat’s Words(trie树 或着STL)
    取石子(一)-博弈数论
    区块链技术开发怎么结合已有产业链落地?
    KafkaConsumer assign VS subscribe
    KafkaConsumer assign VS subscribe
    KafkaConsumer assign VS subscribe
  • 原文地址:https://www.cnblogs.com/HopeGi/p/2945877.html
Copyright © 2020-2023  润新知