最近做的一個項目需要使用到線上解壓縮的過程。
需求是這樣的,使用者可以将所有需要上傳的檔案進行打包然後上傳到伺服器,伺服器将壓縮包進行解壓,然後對其中的檔案進行逐個處理。
其中将壓縮包進行伺服器端解壓的過程就是通過ICSharpCode.SharpZipLib.dll來實作的。對于這個dll檔案,可以通過搜尋這個dll檔案的名字下載下傳到。
原來沒有使用過,是以拿來幫助文檔依葫蘆畫瓢。
1. 在項目中添加對ICSharpCode.SharpZipLib.dll的引用;
2. 在需要使用到ICSharpCode.SharpZipLib中定義的類的編碼界面中将其導入(Imports)
(在C#中是using);
3. 在選擇命名空間的時候,你會發現在有這樣幾個同級的命名空間:
ICSharpCode.SharpZipLib.BZip2;
ICSharpCode.SharpZipLib.GZip;
ICSharpCode.SharpZipLib.Tar;
ICSharpCode.SharpZipLib.Zip。
這四個命名空間就對應着四種檔案壓縮方式,其中我們用的較多的是Zip的壓縮方式,因為通過WinRAR軟體就可以将檔案壓縮成.Zip的壓縮包。這裡有兩點需要說明一下:
1) 目前還沒有發現提供對.RAR方式壓縮檔案操作的方法;
2) BZip2, GZip 這兩種壓縮算法僅僅針對一個檔案的壓縮,如果你的壓縮包要包含許多檔案,并需要将這些檔案解壓出來進行操作的話,最好選用Tar和Zip的壓縮方式。
關于這四種壓縮算法的介紹可以從維基百科上得到,這裡就不再贅述了。
好了,下面看看在伺服器端對Zip壓縮檔案進行解壓縮的過程,下面是其幫助文檔中提供的例子。由于這裡最需要注意的就是ZipInputStream類的使用,是以你可以通過在幫助文檔中搜尋ZipInputStream找到這個例子。
using System;
using System.Text;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
class MainClass
{
public static void Main(string[] args)
{
//這裡通過File.OpenRead方法讀取指定檔案,并通過其傳回的FileStream構造ZipInputStream對象;
using ( ZipInputStream s = new ZipInputStream(File.OpenRead(args[0]))) {
//每個包含在Zip壓縮包中的檔案都被看成是ZipEntry對象,并通過ZipInputStream的GetNextEntry方法
//依次周遊所有包含在壓縮包中的檔案。
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null) {
int size = 2048;
byte[] data = new byte[2048];
//然後以檔案資料塊的方式将資料列印在控制台上;
Console.Write("Show contents (y/n) ?");
if (Console.ReadLine() == "y") {
while (true) {
size = s.Read(data, 0, data.Length);
if (size > 0) {
Console.Write(new ASCIIEncoding().GetString(data, 0, size));
} else {
break;
}
}
}
}
}
}
}
這裡需要注意的幾個屬性是:
1. ZipEntry.Name, 可以得到包含在要所封包件中的檔案名;
2. ZipEntry.CompressedSize, 是指目前檔案被壓縮後的大小;
3. ZipEntry.Size 是指目前檔案原本大小。
這兩個大小(Size)需要指明清楚,否則可能在寫入檔案的時候會出現檔案内容被截斷的現象。