程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 制作Zip壓縮包,

C# 制作Zip壓縮包,

編輯:C#入門知識

C# 制作Zip壓縮包,


壓縮包制作也是很多項目中需要用到的功能。比如有大量的文件(假設有10000個)需要上傳,1個1個的上傳似乎不太靠譜(靠,那得傳到什麼時候啊?),這時我們可以制作一個壓縮包zip,直接傳這個文件到服務器端,然後在服務器目錄解壓,釋放裡面的文件。

這裡我們選用ICSharpCode.SharpZipLib這個類庫來實現我們的需求。

ICSharpCode.SharpZipLib提供了兩個壓縮算法的實現,分別是BZIP2(壓縮時間長,壓縮率高)和GZIP(壓縮效率高,壓縮率低)。

先定義一個枚舉,用於程序標示是哪個壓縮算法。

 

01 /// <summary> 02  /// 壓縮枚舉 03  /// </summary> 04  public enum ZipEnum 05  { 06      //壓縮時間長,壓縮率高 07      BZIP2, 08   09      //壓縮效率高,壓縮率低 10      GZIP 11  }

單個文件的壓縮:

 

 

01 #region 制作壓縮包(單個文件壓縮) 02  /// <summary> 03  /// 制作壓縮包(單個文件壓縮) 04  /// </summary> 05  /// <param name="sourceFileName">原文件</param> 06  /// <param name="zipFileName">壓縮文件</param> 07  /// <param name="zipEnum">壓縮算法枚舉</param> 08  /// <returns>壓縮成功標志</returns> 09  public static bool ZipFile(string srcFileName, string zipFileName, ZipEnum zipEnum) 10  { 11      bool flag = true; 12      try 13      { 14          switch (zipEnum) 15          { 16              case ZipEnum.BZIP2: 17   18                  FileStream inStream = File.OpenRead(srcFileName); 19                  FileStream outStream = File.Open(zipFileName, FileMode.Create); 20   21                  //參數true表示壓縮完成後,inStream和outStream連接都釋放 22                  BZip2.Compress(inStream, outStream, true, 4096); 23   24                  inStream.Close(); 25                  outStream.Close(); 26   27   28                  break; 29              case ZipEnum.GZIP: 30   31                  FileStream srcFile = File.OpenRead(srcFileName); 32   33                  GZipOutputStream zipFile = newGZipOutputStream(File.Open(zipFileName, FileMode.Create)); 34   35                  byte[] fileData = new byte[srcFile.Length]; 36                  srcFile.Read(fileData, 0, (int)srcFile.Length); 37                  zipFile.Write(fileData, 0, fileData.Length); 38   39                  srcFile.Close(); 40                  zipFile.Close(); 41   42                  break; 43              defaultbreak; 44          } 45      } 46      catch 47      { 48          flag = false; 49      } 50      return flag; 51  } 52  #endregion

單個文件的解壓縮:

 

 

01 #region 解壓縮包(單個文件解壓縮) 02  /// <summary> 03  /// 解壓縮包(單個文件解壓縮) 04  /// </summary> 05  /// <param name="zipFileName">壓縮文件</param> 06  /// <param name="unzipFileName">解壓縮文件</param> 07  /// <param name="zipEnum">壓縮算法枚舉</param> 08  /// <returns>壓縮成功標志</returns> 09  public static bool UnZipFile(string zipFileName, stringunzipFileName, ZipEnum zipEnum) 10  { 11      bool flag = true; 12      try 13      { 14          switch (zipEnum) 15          { 16              case ZipEnum.BZIP2: 17                  FileStream inStream = File.OpenRead(zipFileName); 18                  FileStream outStream = File.Open(unzipFileName, FileMode.Create); 19                  BZip2.Decompress(inStream, outStream, true); 20                  break; 21              case ZipEnum.GZIP: 22                  GZipInputStream zipFile = newGZipInputStream(File.OpenRead(zipFileName)); 23                  FileStream destFile = File.Open(unzipFileName, FileMode.Create); 24   25                  int bufferSize = 2048 * 2; 26                  byte[] fileData = new byte[bufferSize]; 27   28                  while (bufferSize > 0) 29                  { 30                      bufferSize = zipFile.Read(fileData, 0, bufferSize); 31                      zipFile.Write(fileData, 0, bufferSize); 32                  } 33                  destFile.Close(); 34                  zipFile.Close(); 35                  break; 36              defaultbreak; 37          } 38      } 39      catch 40      { 41          flag = false; 42      } 43      return flag; 44  } 45  #endregion

上面的兩個方法在引用了dll後,可以直接使用。

 

看到這裡,相信讀者有疑問了,如果我想讓多個文件壓縮到1個zip包裡呢?甚至可以給文件加密?給zip包加注釋?

好吧,我這裡繼續貼兩個方法,都經過測試,可用。

制作壓縮包:

 

01 #region 制作壓縮包(多個文件壓縮到一個壓縮包,支持加密、注釋) 02  /// <summary> 03  /// 制作壓縮包(多個文件壓縮到一個壓縮包,支持加密、注釋) 04  /// </summary> 05  /// <param name="topDirectoryName">壓縮文件目錄</param> 06  /// <param name="zipedFileName">壓縮包文件名</param> 07  /// <param name="compresssionLevel">壓縮級別 1-9</param> 08  /// <param name="password">密碼</param> 09  /// <param name="comment">注釋</param> 10  public static void ZipFiles(string topDirectoryName, string zipedFileName, intcompresssionLevel, string password, string comment) 11  { 12      using (ZipOutputStream zos = newZipOutputStream(File.Open(zipedFileName, FileMode.OpenOrCreate))) 13      { 14          if (compresssionLevel != 0) 15          { 16              zos.SetLevel(compresssionLevel);//設置壓縮級別 17          } 18   19          if (!string.IsNullOrEmpty(password)) 20          { 21              zos.Password = password;//設置zip包加密密碼 22          } 23   24          if (!string.IsNullOrEmpty(comment)) 25          { 26              zos.SetComment(comment);//設置zip包的注釋 27          } 28   29          //循環設置目錄下所有的*.jpg文件(支持子目錄搜索) 30          foreach (string file inDirectory.GetFiles(topDirectoryName, "*.jpg", SearchOption.AllDirectories)) 31          { 32              if (File.Exists(file)) 33              { 34                  FileInfo item = new FileInfo(file); 35                  FileStream fs = File.OpenRead(item.FullName); 36                  byte[] buffer = new byte[fs.Length]; 37                  fs.Read(buffer, 0, buffer.Length); 38   39                  ZipEntry entry = new ZipEntry(item.Name); 40                  zos.PutNextEntry(entry); 41                  zos.Write(buffer, 0, buffer.Length); 42              } 43          } 44      } 45  } 46  #endregion

解壓縮包:

 

 

01 #region 解壓縮包(將壓縮包解壓到指定目錄) 02  /// <summary> 03  /// 解壓縮包(將壓縮包解壓到指定目錄) 04  /// </summary> 05  /// <param name="zipedFileName">壓縮包名稱</param> 06  /// <param name="unZipDirectory">解壓縮目錄</param> 07  /// <param name="password">密碼</param> 08  public static void UnZipFiles(string zipedFileName, string unZipDirectory, stringpassword) 09  { 10      using (ZipInputStream zis = newZipInputStream(File.Open(zipedFileName, FileMode.OpenOrCreate))) 11      { 12          if (!string.IsNullOrEmpty(password)) 13          { 14              zis.Password = password;//有加密文件的,可以設置密碼解壓 15          } 16   17          ZipEntry zipEntry; 18          while ((zipEntry = zis.GetNextEntry()) != null) 19          { 20              string directoryName = Path.GetDirectoryName(unZipDirectory); 21              string pathName = Path.GetDirectoryName(zipEntry.Name); 22              string fileName = Path.GetFileName(zipEntry.Name); 23   24              pathName = pathName.Replace(".""$"); 25              directoryName += "\\" + pathName; 26   27              if (!Directory.Exists(directoryName)) 28              { 29                  Directory.CreateDirectory(directoryName); 30              } 31   32              if (!string.IsNullOrEmpty(fileName)) 33              { 34                  FileStream fs = File.Create(Path.Combine(directoryName, fileName)); 35                  int size = 2048; 36                  byte[] bytes = new byte[2048]; 37                  while (true) 38                  { 39                      size = zis.Read(bytes, 0, bytes.Length); 40                      if (size > 0) 41                      { 42                          fs.Write(bytes, 0, size); 43                      } 44                      else 45                      { 46                          break; 47                      } 48                  } 49                  fs.Close(); 50              } 51          } 52      } 53  } 54  #endregion

調用時我們可以這麼寫:

 

ZipFileUtil.ZipFiles(@"E:\\test\\", "E:\\test.zip", 1, "admin", "this is admin's comment.");//制作壓縮包

 

ZipFileUtil.UnZipFiles("E:\\test.zip", "E:\\guwei4037\\", "admin");//解壓縮包

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved