使用國外開源加壓解壓庫ICSharpCode.SharpZipLib實現加壓,該庫的官方網站為
http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx
使用體驗:可以照著例子實現簡單的加壓解壓,可以加壓一個檔案夾中的所有檔案,但沒有提供加壓子檔案夾的說明。
目前網上的一些代碼有的無法加壓空檔案夾,有的加壓了用rar解不開,這是一點需要改進的。
但如果只需要加壓檔案夾第一級子目錄中的“檔案”(不包括檔案夾和子目錄)的情況,使用這個庫是很方便的。而且是正常zip格式。
比.Net提供的GZipStream類強在它可以按照標準zip格式加壓多個檔案,而GZipStream沒有提供加壓多個檔案的方法,需要自己定義,
這樣解壓也只有使用自己的程式才可以,通用性方面不如SharpZipLib。
using ICSharpCode.SharpZipLib.Zip;<br /> #region 加壓解壓方法<br /> /// <summary><br /> /// 功能:壓縮檔(暫時只壓縮檔夾下一級目錄中的檔案,檔案夾及其子級被忽略)<br /> /// </summary><br /> /// <param name="dirPath">被壓縮的檔案夾夾路徑</param><br /> /// <param name="zipFilePath">產生壓縮檔的路徑,為空白則預設與被壓縮檔夾同一級目錄,名稱為:檔案夾名+.zip</param><br /> /// <param name="err">出錯資訊</param><br /> /// <returns>是否壓縮成功</returns><br /> public bool ZipFile(string dirPath, string zipFilePath, out string err)<br /> {<br /> err = "";<br /> if (dirPath == string.Empty)<br /> {<br /> err = "要壓縮的檔案夾不可為空!";<br /> return false;<br /> }<br /> if (!Directory.Exists(dirPath))<br /> {<br /> err = "要壓縮的檔案夾不存在!";<br /> return false;<br /> }<br /> //壓縮檔名為空白時使用檔案夾名+.zip<br /> if (zipFilePath == string.Empty)<br /> {<br /> if (dirPath.EndsWith("//"))<br /> {<br /> dirPath = dirPath.Substring(0, dirPath.Length - 1);<br /> }<br /> zipFilePath = dirPath + ".zip";<br /> }</p><p> try<br /> {<br /> string[] filenames = Directory.GetFiles(dirPath);<br /> using (ZipOutputStream s = new ZipOutputStream(File.Create(zipFilePath)))<br /> {<br /> s.SetLevel(9);<br /> byte[] buffer = new byte[4096];<br /> foreach (string file in filenames)<br /> {<br /> ZipEntry entry = new ZipEntry(Path.GetFileName(file));<br /> entry.DateTime = DateTime.Now;<br /> s.PutNextEntry(entry);<br /> using (FileStream fs = File.OpenRead(file))<br /> {<br /> int sourceBytes;<br /> do<br /> {<br /> sourceBytes = fs.Read(buffer, 0, buffer.Length);<br /> s.Write(buffer, 0, sourceBytes);<br /> } while (sourceBytes > 0);<br /> }<br /> }<br /> s.Finish();<br /> s.Close();<br /> }<br /> }<br /> catch (Exception ex)<br /> {<br /> err = ex.Message;<br /> return false;<br /> }<br /> return true;<br /> }</p><p> /// <summary><br /> /// 功能:解壓zip格式的檔案。<br /> /// </summary><br /> /// <param name="zipFilePath">壓縮檔路徑</param><br /> /// <param name="unZipDir">解壓檔案存放路徑,為空白時預設與壓縮檔同一級目錄下,跟壓縮檔同名的檔案夾</param><br /> /// <param name="err">出錯資訊</param><br /> /// <returns>解壓是否成功</returns><br /> public bool UnZipFile(string zipFilePath, string unZipDir, out string err)<br /> {<br /> err = "";<br /> if (zipFilePath == string.Empty)<br /> {<br /> err = "壓縮檔不可為空!";<br /> return false;<br /> }<br /> if (!File.Exists(zipFilePath))<br /> {<br /> err = "壓縮檔不存在!";<br /> return false;<br /> }<br /> //解壓檔案夾為空白時預設與壓縮檔同一級目錄下,跟壓縮檔同名的檔案夾<br /> if (unZipDir == string.Empty)<br /> unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath));<br /> if (!unZipDir.EndsWith("//"))<br /> unZipDir += "//";<br /> if (!Directory.Exists(unZipDir))<br /> Directory.CreateDirectory(unZipDir);</p><p> try<br /> {<br /> using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath)))<br /> {</p><p> ZipEntry theEntry;<br /> while ((theEntry = s.GetNextEntry()) != null)<br /> {<br /> string directoryName = Path.GetDirectoryName(theEntry.Name);<br /> string fileName = Path.GetFileName(theEntry.Name);<br /> if (directoryName.Length > 0)<br /> {<br /> Directory.CreateDirectory(unZipDir + directoryName);<br /> }<br /> if (!directoryName.EndsWith("//"))<br /> directoryName += "//";<br /> if (fileName != String.Empty)<br /> {<br /> using (FileStream streamWriter = File.Create(unZipDir + theEntry.Name))<br /> {</p><p> int size = 2048;<br /> byte[] data = new byte[2048];<br /> while (true)<br /> {<br /> size = s.Read(data, 0, data.Length);<br /> if (size > 0)<br /> {<br /> streamWriter.Write(data, 0, size);<br /> }<br /> else<br /> {<br /> break;<br /> }<br /> }<br /> }<br /> }<br /> }//while<br /> }<br /> }<br /> catch (Exception ex)<br /> {<br /> err = ex.Message;<br /> return false;<br /> }<br /> return true;<br /> }//解壓結束<br /> #endregion