1. 程式人生 > >asp.net 實現檔案的壓縮和解壓

asp.net 實現檔案的壓縮和解壓

如果該部落格能給您帶來幫助,請給博主一個評論謝謝!!話不多說下面請看具體的實現步驟。
1.首先在web專案中引用ICSharpCode.SharpZipLib.dll檔案,可在博主的資源中下載。
2.具體的壓縮和解壓方法實現如下(程式碼中有詳細的備註)

 /// <summary>
        /// 生成壓縮檔案
        /// </summary>
        /// <param name="strZipPath">生成的zip檔案的路徑</param>
        /// <param name="strZipTopDirectoryPath">
原始檔的上級目錄</param>
/// <param name="intZipLevel">T壓縮等級</param> /// <param name="strPassword">壓縮包解壓密碼</param> /// <param name="filesOrDirectoriesPaths">原始檔路徑</param> /// <returns></returns> private bool Zip(string strZipPath, string
strZipTopDirectoryPath, int intZipLevel, string strPassword, string[] filesOrDirectoriesPaths) { try { List<string> AllFilesPath = new List<string>();//新建路徑集合 if (filesOrDirectoriesPaths.Length > 0) //得到原路徑的所有檔案 { for
(int i = 0; i < filesOrDirectoriesPaths.Length; i++) { if (System.IO.File.Exists(filesOrDirectoriesPaths[i]))//檢測如果存在的是檔案 { AllFilesPath.Add(filesOrDirectoriesPaths[i]);//新增到新路徑集合中 } else if (Directory.Exists(filesOrDirectoriesPaths[i]))//檢測如果存在的是路徑 { GetDirectoryFiles(filesOrDirectoriesPaths[i], AllFilesPath);//將路徑中的所有檔案新增到新檔案集合中 } } } if (AllFilesPath.Count > 0)//驗證檔案集合長度是否大於0 { ZipOutputStream zipOutputStream = new ZipOutputStream(System.IO.File.Create(strZipPath));//新建壓縮檔案流 zipOutputStream.SetLevel(intZipLevel);//設定壓縮檔案等級 zipOutputStream.Password = strPassword;//設定壓縮包解壓縮密碼 for (int i = 0; i < AllFilesPath.Count; i++)//獲取列表集合 { string strFile = AllFilesPath[i].ToString();//取出單個檔案 try { if (strFile.Substring(strFile.Length - 1) == "") //folder檢測檔案長度 { string strFileName = strFile.Replace(strZipTopDirectoryPath, "");//取出檔名稱 去除前面的檔案路徑 if (strFileName.StartsWith("")) { strFileName = strFileName.Substring(1); } ZipEntry entry = new ZipEntry(strFileName);// entry.DateTime = DateTime.Now; zipOutputStream.PutNextEntry(entry); } else //file { FileStream fs = System.IO.File.OpenRead(strFile);//讀取檔案 byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); string strFileName = strFile.Replace(strZipTopDirectoryPath, ""); if (strFileName.StartsWith("")) { strFileName = strFileName.Substring(0); } ZipEntry entry = new ZipEntry(strFileName);//指定名稱建立新的 ZIP 條目 entry.DateTime = DateTime.Now;//指定當前時間 zipOutputStream.PutNextEntry(entry);//為壓縮檔案流提供一個容器 zipOutputStream.Write(buffer, 0, buffer.Length);//寫入檔案 fs.Close(); fs.Dispose(); } } catch { continue; } } zipOutputStream.Finish();//結束壓縮 zipOutputStream.Close();//關閉 return true; } else { return false; } } catch { return false; } } /// <summary> /// 檔案解壓 /// </summary> /// <param name="strZipPath">壓縮包路徑</param> /// <param name="strOldPath">解壓檔案源目錄</param> /// <returns></returns> private bool UnZipFile(string strZipPath, string strOldPath) { string un_dir = strOldPath + "user"; Directory.CreateDirectory(un_dir); //建立以解壓時間為名稱的資料夾 ZipInputStream f = new ZipInputStream(System.IO.File.OpenRead(strZipPath)); //讀取壓縮檔案,並用此檔案流新建 “ZipInputStream”物件 ZipEntry zp = null; while ((zp = f.GetNextEntry()) != null) { int i = 2048; byte[] b = new byte[i]; //每次緩衝 2048 位元組 FileStream s = System.IO.File.Create(un_dir + "\\ " + zp.Name); //(B)-新建檔案流 while (true) //持續讀取位元組,直到一個“ZipEntry”位元組讀完 { i = f.Read(b, 0, b.Length); //讀取“ZipEntry”中的位元組 if (i > 0) s.Write(b, 0, i); //將位元組寫入新建的檔案流 else break; //讀取的位元組為 0 ,跳出迴圈 } } f.Close(); return true; } /// <summary> /// 得到存放目錄下的所有檔案 /// </summary> /// <param name="strParentDirectoryPath">原始檔路徑</param> /// <param name="AllFilesPath">所有檔案路徑</param> private void GetDirectoryFiles(string strParentDirectoryPath, List<string> AllFilesPath) { string[] files = Directory.GetFiles(strParentDirectoryPath); for (int i = 0; i < files.Length; i++) { AllFilesPath.Add(files[i]); } string[] directorys = Directory.GetDirectories(strParentDirectoryPath); for (int i = 0; i < directorys.Length; i++) { GetDirectoryFiles(directorys[i], AllFilesPath); } if (files.Length == 0 && directorys.Length == 0) { AllFilesPath.Add(strParentDirectoryPath); } } //引用方式 在main方法中新增如下程式碼(可被觸發的方法就行) string strZipPath =@"D:\HttpHandlers\UploadFile\user.zip"; string strZipTopDirectoryPath = @"D:\HttpHandlers\UploadFile\"; int intZipLevel = 6; string strPassword = ""; string[] filesOrDirectoriesPaths = new string[] { @"D:\HttpHandlers\UploadFile\" }; Zip(strZipPath, strZipTopDirectoryPath, intZipLevel, strPassword, filesOrDirectoriesPaths);//壓縮方法 //UnZipFile(strZipPath, strZipTopDirectoryPath);//解壓方法