天天看點

使用SharpZipLib壓縮打包多個記憶體中的檔案

SharpZipLib是C#寫的開源壓縮解壓縮元件,最近項目上遇到一個需求:根據使用者選擇的項目生成CSV檔案并下載下傳,後來改為同時生成2個CSV檔案下載下傳下來。想到的解決辦法就是将2個CSV檔案打包成一個Zip檔案,然後供使用者下載下傳。

SharpZipLib可以通過很簡單的代碼就将多個檔案打包成一個zip包,形如:

using (ZipFile zip = ZipFile.Create(@"E:\test.zip")) 

    zip.BeginUpdate(); 

    ZipEntry e=new ZipEntry("a"); 

    //添加檔案 

    zip.Add(@"E:\a.csv"); 

    zip.Add(@"E:\b.csv"); 

    zip.CommitUpdate(); 

}

但是這裡的問題是,zip.Add方法允許添加檔案,但是不允許直接添加字元串或者byte[],但是我們做的是WebApplication,不希望是在Web伺服器上把兩個CSV檔案生成後儲存到硬碟上,然後調用上面的方法壓縮硬碟上的檔案。我們的檔案應該都是在記憶體中生成,在記憶體中打包,然後直接把生成的zip檔案的二進制流傳回給使用者,讓使用者下載下傳。幸好該方法提供了一個IStaticDataSource接口參數,該接口有個傳回Stream的GetSource方法,我們可以實作該接口,進而支援字元串檔案的打包。

class StringDataSource : IStaticDataSource 

    public string Str { get; set; }

    public StringDataSource(string str) 

    { 

        this.Str = str; 

    }

    public Stream GetSource() 

        Stream s = new MemoryStream(Encoding.Default.GetBytes(Str)); 

        return s; 

    } 

實作了該接口後,那麼我們壓縮兩個String成兩個文本檔案的包,代碼就十分簡單了:

using (ZipFile zip = ZipFile.Create(@"E:\test2.zip")) 

    StringDataSource d1 = new StringDataSource("this a test1"); 

    StringDataSource d2 = new StringDataSource("壓縮檔案2的内容"); 

    zip.Add(d1, "Test1.txt"); 

    zip.Add(d2, "Test2.txt"); 

上面的代碼還是在硬碟上生成了test2.zip,幸好ZipFile.Create方法支援Stream參數,于是可以将代碼改為:

MemoryStream stream=new MemoryStream(); 

using (ZipFile zip = ZipFile.Create(stream)) 

然後将stream繼續Render給使用者即可。

同樣的方式,如果是在記憶體中生成了二進制檔案,也可以使用實作IStaticDataSource接口的方式來打包。

本文轉自深藍居部落格園部落格,原文連結:http://www.cnblogs.com/studyzy/archive/2011/11/19/2255490.html,如需轉載請自行聯系原作者