zoukankan      html  css  js  c++  java
  • C#实现Zip压缩解压实例

     本文只列举一个压缩帮助类,使用的是有要添加一个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.  } 
  • 相关阅读:
    移植性问题のCString转char * ,string
    HDU 2894(欧拉回路)
    POJ 1149(最大流)
    POJ 3422 K取方格数(费用流)/TYVJ 1413
    POJ 1112(染色+连通分量+DP)
    POJ 2195(KM模板题)
    POJ 3615(FLOYD应用)
    POJ 1797(SPFA变种)spfa能做很多!
    POJ 1325(最小点覆盖)
    NOI2010 海拔(平面图最大流)
  • 原文地址:https://www.cnblogs.com/hsyzero/p/3296682.html
Copyright © 2011-2022 走看看