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

C#實現文件壓縮解壓類

編輯:C#入門知識

壓縮 與 解壓類如下 (注:僅支持 .zip 的壓縮與解壓)   [csharp]   using System;   using System.Collections.Generic;   using System.Linq;   using System.Web;   using ICSharpCode.SharpZipLib.Zip;   using System.IO;   using ICSharpCode.SharpZipLib.Checksums;   using System.Text;      namespace 文件壓縮與解壓   {       public class ZipClass       {             #region 壓縮文件           /// <summary>           /// 壓縮文件           /// </summary>           /// <param name="FileToZip">待壓縮的文件</param>           /// <param name="ZipedFile">壓縮後的文件</param>           /// <param name="password">壓縮密碼</param>           private void ZipFile(string FileToZip, string ZipedFile,string password)           {   //如果文件沒有找到,則報錯                if (!System.IO.File.Exists(FileToZip))               {                   throw new System.IO.FileNotFoundException("文件 " + FileToZip + "不存在!");               }               //取得待壓縮文件流               System.IO.FileStream StreamToZip = new System.IO.FileStream(FileToZip, System.IO.FileMode.Open, System.IO.FileAccess.Read);               //創建壓縮後的文件               System.IO.FileStream ZipFile = System.IO.File.Create(ZipedFile);               //創建新的ZIP輸出流               ZipOutputStream ZipStream = new ZipOutputStream(ZipFile);               // 每一個被壓縮的文件都用ZipEntry表示,需要為每一個壓縮後的文件設置名稱                 ZipEntry ZipEntry = new ZipEntry("ZippedFile");               //設置每一個ZipEntry對象               ZipStream.PutNextEntry(ZipEntry);               // 為後續的 DEFLATED 條目設置壓縮級別。 0 -9               ZipStream.SetLevel(6);               //設置解壓密碼               ZipStream.Password = password;               //每次寫入1024個字節               byte[] buffer = new byte[1024];               int size = 0; //已寫入壓縮流的字節數               try               {                   //如果沒有寫入完成                   while (size < StreamToZip.Length)                   {                       //將文件內容寫入buffer                       int sizeRead = StreamToZip.Read(buffer, 0, buffer.Length);                       //將字節寫入壓縮流                       ZipStream.Write(buffer, 0, sizeRead);                       size += sizeRead;                   }               }               catch (System.Exception ex)               {                   throw ex;               }               //完成寫入 ZIP 輸出流的內容,無需關閉底層流。               ZipStream.Finish();               //關閉 ZIP 輸出流和正在過濾的流。               ZipStream.Close();               //關閉文件流               StreamToZip.Close();           }           #endregion 壓縮文件             #region 壓縮文件夾(私有不被外部調用)           /// <summary>           /// 壓縮文件夾           /// </summary>           /// <param name="FileToZip">待壓縮的文件夾</param>           /// <param name="ZipStream">壓縮文件流</param>           /// <param name="ParentFolderName">壓縮父目錄</param>           private void ZipFolder(string FolderToZip, ZipOutputStream ZipStream, string ParentFolderName)           {   //如果文件夾沒有找到,則報錯                if (!System.IO.Directory.Exists(FolderToZip))               {                   throw new System.IO.FileNotFoundException("文件路徑 " + FolderToZip + "不存在!");               }               //校驗類               Crc32 crc = new Crc32();               //取得路徑下所有文件全路徑               string[] filenames = Directory.GetFiles(FolderToZip);                             //循環壓縮文件               foreach (string file in filenames)               {    //打開要的壓縮文件                    if (!System.IO.File.Exists(file)) //判斷文件是否存在                   {                       throw new System.IO.FileNotFoundException("待壓縮的文件 " + file + "不存在!");                   }                   //取得待壓縮文件流                   FileStream fs = File.OpenRead(file);                   byte[] buffer = new byte[fs.Length];                   //將文件寫入字節數組                   fs.Read(buffer, 0, buffer.Length);                      //壓縮文件後的目錄                   string ZipPath = Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip) + "/" + Path.GetFileName(file));                   ZipEntry entry = new ZipEntry(ZipPath);                    entry.DateTime = DateTime.Now;                   //設置size                   entry.Size = fs.Length;                   //關閉文件流                   fs.Close();                   // 將 CRC-32 重置為初始值。                   crc.Reset();                   // 使用指定的字節數組更新校驗和。                   crc.Update(buffer);                   // 設置 CRC-32 值。                   entry.Crc = crc.Value;                   //設置每一個ZipEntry對象                   ZipStream.PutNextEntry(entry);                   //將字節寫入壓縮流                   ZipStream.Write(buffer, 0, buffer.Length);               }                             //取得路徑下所有文件夾全路徑               string[] folders = Directory.GetDirectories(FolderToZip);               //循環壓縮文件夾下層目錄的文件               foreach (string folder in folders)               {                   ZipFolder(folder, ZipStream, Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip)));               }           }           #endregion 壓縮文件夾             #region 壓縮文件夾 (可被外部應用)           /// <summary>           /// 壓縮文件夾           /// </summary>           /// <param name="FileToZip">待壓縮的文件夾</param>           /// <param name="ZipStream">壓縮後的文件</param>           /// <param name="password">壓縮密碼</param>           public void ZipFolder(string FolderToZip, string ZipedFile, string password)           {              // 解決中文亂碼               Encoding gbk = Encoding.GetEncoding("gbk");               ZipConstants.DefaultCodePage = gbk.CodePage;                  //創建壓縮後的文件               System.IO.FileStream zipFile = System.IO.File.Create(ZipedFile);               //創建新的ZIP輸出流               ZipOutputStream ZipStream = new ZipOutputStream(zipFile);               //設置解壓密碼               ZipStream.Password = password;               // 為後續的 DEFLATED 條目設置壓縮級別。 0 -9               ZipStream.SetLevel(6);               //壓縮文件夾               ZipFolder(FolderToZip, ZipStream, "");               //完成寫入 ZIP 輸出流的內容,無需關閉底層流。               ZipStream.Finish();               //關閉 ZIP 輸出流和正在過濾的流。               ZipStream.Close();           }           #endregion 壓縮文件夾             #region 壓縮文件(根據路徑 自動判定是文件夾還是文件)           /// <summary>           /// 壓縮文件           /// </summary>           /// <param name="FileToZip">待壓縮的文件(夾)路徑</param>           /// <param name="ZipStream">壓縮後的文件</param>           /// <param name="password">壓縮密碼</param>           public void ZipFileMain(string FileToZip, string ZipedFile, string password)           {               //為壓縮文件夾               if (Directory.Exists(FileToZip))               {                   //壓縮文件夾                   ZipFolder(FileToZip, ZipedFile, password);               }               //為壓縮文件               else if (File.Exists(FileToZip))               {                   // //壓縮文件                   ZipFile(FileToZip, ZipedFile, password);               }               else {                   throw new System.IO.FileNotFoundException("待壓縮的文件目錄 " + FileToZip + "出錯!");               }           }              #endregion 壓縮文件(根據路徑 自動判定是文件夾還是文件)               #region 解壓文件           /// <summary>           /// 解壓           /// </summary>           /// <param name="args">           //    args[0] = Server.MapPath("ZIP") + "\\f12Zip.zip"; //待解壓的文件             //   args[1]=Server.MapPath("UPZIP\\");//解壓後放置的目標目錄            //  或           //    args[0] =  "D:\\f12Zip.zip"; //待解壓的文件             //   args[1]="D:\\UPZIP\\");  //解壓後放置的目標目錄            //</param>           /// <summary>           /// 解壓           /// </summary>           /// <param name="UpZipFile">待解壓文件</param>           /// <param name="ZipToFile">解壓後放置的目標目錄</param>           /// <param name="password">解壓密碼</param>           public void UnZip(string UpZipFile, string ZipToFile,string password)           {               if (!System.IO.File.Exists(UpZipFile))               {                   throw new System.IO.FileNotFoundException("文件 " + UpZipFile + "不存在!");               }               //創建新的ZIP輸入流               ZipInputStream ZipStream = new ZipInputStream(File.OpenRead(UpZipFile));               //設置解壓密碼               ZipStream.Password = password;               ZipEntry theEntry;               while ((theEntry = ZipStream.GetNextEntry()) != null)                 {                   //取得解壓後的目錄                   string directoryName = Path.GetDirectoryName(ZipToFile);                   //取得解壓文件下的文件名                    string fileName = Path.GetFileName(theEntry.Name);                   //取得子目錄                   string filepath = Path.GetDirectoryName(theEntry.Name);                   //取得解壓文件名                   //如 xxxxx.zip                   string ZipFile = Path.GetFileName(UpZipFile);                   //去掉文件名後綴 xxxxx                   string zipfile = ZipFile.Split('.')[0];                   //創建解壓後文件目錄                   string filePath = directoryName + "\\" + zipfile + "\\" + filepath + "\\";                   Directory.CreateDirectory(filePath);                   if (fileName != String.Empty)                   {                               //解壓文件到指定的目錄                           FileStream streamWriter = File.Create(filePath + "\\" + fileName);                       int size = 2048;                       byte[] data = new byte[2048];                       while (true)                       {                           size = ZipStream.Read(data, 0, data.Length);                           if (size > 0)                           {                               streamWriter.Write(data, 0, size);                           }                           else { break; }                       }                       streamWriter.Close();                   }               }               ZipStream.Close();           }           #endregion 解壓文件          }   }         調用方式:                string filepath = Server.MapPath("freezip");             string strtxtPath = filepath;  //壓縮文件夾             string strzipPath = Server.MapPath("ZIP") + "\\f12Zip.zip";               //  strtxtPath= "C:\\unzipped\\";//待壓縮文件目錄              //  strzipPath="C:\\zip\\a.zip";  //壓縮後的目標文件                    ZipClass zc = new ZipClass();             zc.ZipFileMain(strtxtPath,strzipPath,""); //壓縮文件   解壓相似。

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