SharpZipLib 是一个免费的组件,可以利用它对 ZIP 等多种格式进行压缩与解压。

可到官方网站下载最新版本:http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx

解压后在程序中添加对ICSharpCode.SharpZipLib.dll的引用即可使用该dll。

 

代码
using ICSharpCode.SharpZipLib.Zip; 

using System.IO; 

  

/// <summary> 

/// Zip 压缩文件 

/// </summary> 

public class Zip 



public Zip() 





#region 压缩方法 

/// <summary> 

/// 功能:压缩文件(暂时只压缩文件夹下一级目录中的文件,文件夹及其子级被忽略) 

/// </summary> 

/// <param name="dirPath">被压缩的文件夹夹路径</param> 

/// <param name="zipFilePath">生成压缩文件的路径,为空则默认与被压缩文件夹同一级目录,名称为:文件夹名+.zip</param> 

/// <param name="err">出错信息</param> 

/// <returns>是否压缩成功</returns> 

public static bool ZipFile(string dirPath, string zipFilePath, out string err) 



err 
= ""

if (dirPath == string.Empty) 



err 
= "要压缩的文件夹不能为空!"

return false



if (!Directory.Exists(dirPath)) 



err 
= "要压缩的文件夹不存在!"

return false



//压缩文件名为空时使用文件夹名+.zip 

if (zipFilePath == string.Empty) 



if (dirPath.EndsWith("\\")) 



dirPath 
= dirPath.Substring(0, dirPath.Length - 1); 



zipFilePath 
= dirPath + ".zip"



try 



string[] filenames = Directory.GetFiles(dirPath); 

using (ZipOutputStream s = new ZipOutputStream(File.Create(zipFilePath))) 



s.SetLevel(
9); 

byte[] buffer = new byte[4096]; 

foreach (string file in filenames) 



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(); 





catch (Exception ex) 



err 
= ex.Message; 

return false



return true



#endregion 

#region 解压方法 

/// <summary> 

/// 功能:解压zip格式的文件。 

/// </summary> 

/// <param name="zipFilePath">压缩文件路径</param> 

/// <param name="unZipDir">解压文件存放路径,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹</param> 

/// <param name="err">出错信息</param> 

/// <returns>解压是否成功</returns> 

public static bool UnZipFile(string zipFilePath, string unZipDir, out string err) 



err 
= ""

if (zipFilePath == string.Empty) 



err 
= "压缩文件不能为空!"

return false



if (!File.Exists(zipFilePath)) 



err 
= "压缩文件不存在!"

return false



//解压文件夹为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹 

if (unZipDir == string.Empty) 

unZipDir 
= zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath)); 

if (!unZipDir.EndsWith("\\")) 

unZipDir 
+= "\\"

if (!Directory.Exists(unZipDir)) 

Directory.CreateDirectory(unZipDir); 

try 



using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath))) 



ZipEntry theEntry; 

while ((theEntry = s.GetNextEntry()) != null



string directoryName = Path.GetDirectoryName(theEntry.Name); 

string fileName = Path.GetFileName(theEntry.Name); 

if (directoryName.Length > 0



Directory.CreateDirectory(unZipDir 
+ directoryName); 



if (!directoryName.EndsWith("\\")) 

directoryName 
+= "\\"

if (fileName != String.Empty) 



using (FileStream streamWriter = File.Create(unZipDir + theEntry.Name)) 



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









}
//while 





catch (Exception ex) 



err 
= ex.Message; 

return false



return true

}
//解压结束 

#endregion

 

 

posted on 2009-10-21 23:14  冯淼森  阅读(336)  评论(0)    收藏  举报