天天看點

Asp.net線上壓縮,ICSharpCode.SharpZipLib 初級使用

最近做的一個項目需要使用到線上解壓縮的過程。

需求是這樣的,使用者可以将所有需要上傳的檔案進行打包然後上傳到伺服器,伺服器将壓縮包進行解壓,然後對其中的檔案進行逐個處理。

其中将壓縮包進行伺服器端解壓的過程就是通過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)需要指明清楚,否則可能在寫入檔案的時候會出現檔案内容被截斷的現象。

繼續閱讀