C#zip压缩类

  • 2019 年 10 月 10 日
  • 筆記

改造了网上的代码,可以压缩文件夹、指定文件列表(文件和文件夹的混合列表,需要指定子文件夹下需要压缩的文件),注释很详细不做解释

    public class ZipHelper      {          /// <summary>          /// 压缩单个文件          /// </summary>          /// <param name="fileToZip">要压缩的文件</param>          /// <param name="zipedFile">压缩后的文件</param>          /// <param name="compressionLevel">压缩等级</param>          /// <param name="blockSize">每次写入大小</param>          public static void ZipFile(string fileToZip, string zipedFile, int compressionLevel, int blockSize)          {              //如果文件没有找到,则报错              if (!System.IO.File.Exists(fileToZip))              {                  throw new System.IO.FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!");              }                using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile))              {                  using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile))                  {                      using (System.IO.FileStream StreamToZip = new System.IO.FileStream(fileToZip, System.IO.FileMode.Open, System.IO.FileAccess.Read))                      {                          string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\") + 1);                            ZipEntry ZipEntry = new ZipEntry(fileName);                            ZipStream.PutNextEntry(ZipEntry);                            ZipStream.SetLevel(compressionLevel);                            byte[] buffer = new byte[blockSize];                            int sizeRead = 0;                            try                          {                              do                              {                                  sizeRead = StreamToZip.Read(buffer, 0, buffer.Length);                                  ZipStream.Write(buffer, 0, sizeRead);                              }                              while (sizeRead > 0);                          }                          catch (System.Exception ex)                          {                              throw ex;                          }                            StreamToZip.Close();                      }                        ZipStream.Finish();                      ZipStream.Close();                  }                    ZipFile.Close();              }          }            /// <summary>          /// 压缩单个文件          /// </summary>          /// <param name="fileToZip">要进行压缩的文件名</param>          /// <param name="zipedFile">压缩后生成的压缩文件名</param>          public static void ZipFile(string fileToZip, string zipedFile)          {              //如果文件没有找到,则报错              if (!File.Exists(fileToZip))              {                  throw new System.IO.FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!");              }                using (FileStream fs = File.OpenRead(fileToZip))              {                  byte[] buffer = new byte[fs.Length];                  fs.Read(buffer, 0, buffer.Length);                  fs.Close();                    using (FileStream ZipFile = File.Create(zipedFile))                  {                      using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile))                      {                          string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\") + 1);                          ZipEntry ZipEntry = new ZipEntry(fileName);                          ZipStream.PutNextEntry(ZipEntry);                          ZipStream.SetLevel(5);                            ZipStream.Write(buffer, 0, buffer.Length);                          ZipStream.Finish();                          ZipStream.Close();                      }                  }              }          }          /// <summary>          /// 压缩文件          /// </summary>          /// <param name="copyTopath">压缩到哪个路径</param>          /// <param name="zipFileName">压缩文件名称</param>          public static void ZipFile(List<string> sourceFileNames, string zipFileName)          {              //压缩文件打包              using (ZipOutputStream s = new ZipOutputStream(File.Create(zipFileName)))              {                  s.SetLevel(9);                  byte[] buffer = new byte[4096];                  foreach (string file in sourceFileNames)                  {                      if (Directory.Exists(file))// 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件                      {                          string pPath = "";                          pPath += Path.GetFileName(file);                          pPath += "\";                          ZipSetp(file, s, pPath, sourceFileNames);                      }                      else // 否则直接压缩文件                      {                            ZipEntry entry = new ZipEntry(Path.GetFileName(file));                          entry.DateTime = DateTime.Now;                          s.PutNextEntry(entry);                          using (FileStream fs = File.OpenRead(file))                          {                              int sourceBytes;                              do                              {                                  sourceBytes = fs.Read(buffer, 0, buffer.Length);                                  s.Write(buffer, 0, sourceBytes);                              } while (sourceBytes > 0);                          }                      }                  }                  s.Finish();                  s.Close();              }          }          /// <summary>          /// 压缩多层目录          /// </summary>          /// <param name="strDirectory">待压缩目录</param>          /// <param name="zipedFile">压缩后生成的压缩文件名,绝对路径</param>          public static void ZipFileDirectory(string strDirectory, string zipedFile)          {              using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile))              {                  using (ZipOutputStream s = new ZipOutputStream(ZipFile))                  {                      s.SetLevel(9);                      ZipSetp(strDirectory, s, "");                  }              }          }          /// <summary>          /// 压缩多层目录          /// </summary>          /// <param name="strDirectory">待压缩目录</param>          /// <param name="zipedFile">压缩后生成的压缩文件名,绝对路径</param>          /// <param name="files">指定要压缩的文件列表(完全路径)</param>          public static void ZipFileDirectory(string strDirectory, string zipedFile, List<string> files)          {              using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile))              {                  using (ZipOutputStream s = new ZipOutputStream(ZipFile))                  {                      s.SetLevel(9);                      ZipSetp(strDirectory, s, "", files);                  }              }          }          /// <summary>          /// 递归遍历目录          /// </summary>          /// <param name="strDirectory">The directory.</param>          /// <param name="s">The ZipOutputStream Object.</param>          /// <param name="parentPath">The parent path.</param>          /// <param name="files">需要压缩的文件</param>          private static void ZipSetp(string strDirectory, ZipOutputStream s, string parentPath, List<string> files = null)          {              if (strDirectory[strDirectory.Length - 1] != Path.DirectorySeparatorChar)              {                  strDirectory += Path.DirectorySeparatorChar;              }                string[] filenames = Directory.GetFileSystemEntries(strDirectory);                byte[] buffer = new byte[4096];              foreach (string file in filenames)// 遍历所有的文件和目录              {                  if (files != null && !files.Contains(file))                  {                      continue;                  }                  if (Directory.Exists(file))// 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件                  {                      string pPath = parentPath;                      pPath += Path.GetFileName(file);                      pPath += "\";                      ZipSetp(file, s, pPath, files);                  }                  else // 否则直接压缩文件                  {                      //打开压缩文件                      string fileName = parentPath + Path.GetFileName(file);                      ZipEntry entry = new ZipEntry(fileName);                        entry.DateTime = DateTime.Now;                        s.PutNextEntry(entry);                      using (FileStream fs = File.OpenRead(file))                      {                          int sourceBytes;                          do                          {                              sourceBytes = fs.Read(buffer, 0, buffer.Length);                              s.Write(buffer, 0, sourceBytes);                          } while (sourceBytes > 0);                        }                  }              }          }            /// <summary>          /// 解压缩一个 zip 文件。          /// </summary>          /// <param name="zipedFile">压缩文件</param>          /// <param name="strDirectory">解压目录</param>          /// <param name="password">zip 文件的密码。</param>          /// <param name="overWrite">是否覆盖已存在的文件。</param>          public static void UnZip(string zipedFile, string strDirectory, bool overWrite, string password)          {                if (strDirectory == "")                  strDirectory = Directory.GetCurrentDirectory();              if (!strDirectory.EndsWith("\"))                  strDirectory = strDirectory + "\";                using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipedFile)))              {                  if (password != null)                  {                      s.Password = password;                  }                  ZipEntry theEntry;                    while ((theEntry = s.GetNextEntry()) != null)                  {                      string directoryName = "";                      string pathToZip = "";                      pathToZip = theEntry.Name;                        if (pathToZip != "")                          directoryName = Path.GetDirectoryName(pathToZip) + "\";                        string fileName = Path.GetFileName(pathToZip);                        Directory.CreateDirectory(strDirectory + directoryName);                        if (fileName != "")                      {                          if ((File.Exists(strDirectory + directoryName + fileName) && overWrite) || (!File.Exists(strDirectory + directoryName + fileName)))                          {                              using (FileStream streamWriter = File.Create(strDirectory + directoryName + 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;                                  }                                  streamWriter.Close();                              }                          }                      }                  }                    s.Close();              }          }          /// <summary>          /// 解压缩一个 zip 文件。          /// </summary>          /// <param name="zipedFile">压缩文件</param>          /// <param name="strDirectory">解压目录</param>          /// <param name="overWrite">是否覆盖已存在的文件。</param>          public static void UnZip(string zipedFile, string strDirectory, bool overWrite)          {              UnZip(zipedFile, strDirectory, overWrite, null);          }          /// <summary>          /// 解压缩一个 zip 文件。          /// 覆盖已存在的文件。          /// </summary>          /// <param name="zipedFile">压缩文件</param>          /// <param name="strDirectory">解压目录</param>          public static void UnZip(string zipedFile, string strDirectory)          {              UnZip(zipedFile, strDirectory, true);          }            /// <summary>          /// 获取压缩文件中指定类型的文件          /// </summary>          /// <param name="zipedFile">压缩文件</param>          /// <param name="fileExtension">文件类型(.txt|.exe)</param>          /// <returns>文件名称列表(包含子目录)</returns>          public static List<string> GetFiles(string zipedFile, List<string> fileExtension)          {              List<string> files = new List<string>();              if (!File.Exists(zipedFile))              {                  //return files;                  throw new FileNotFoundException(zipedFile);              }                using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipedFile)))              {                  ZipEntry theEntry;                  while ((theEntry = s.GetNextEntry()) != null)                  {                      if (theEntry.IsFile)                      {                          //Console.WriteLine("Name : {0}", theEntry.Name);                          if (fileExtension != null)                          {                              if (fileExtension.Contains(Path.GetExtension(theEntry.Name)))                              {                                  files.Add(theEntry.Name);                              }                          }                          else                          {                              files.Add(theEntry.Name);                          }                      }                  }                  s.Close();              }                return files;          }            /// <summary>          /// 获取压缩文件中的所有文件          /// </summary>          /// <param name="zipedFile">压缩文件</param>          /// <returns>文件名称列表(包含子目录)</returns>          public static List<string> GetFiles(string zipedFile)          {              return GetFiles(zipedFile, null);          }      }