2012-02-07 140 views
3

我想壓縮一堆文件,並通過數據流使數據消耗。DotNetZip流式傳輸

我想保持內存佔用儘可能小。

我的想法是實現一個流,我有一堆FileStream對象作爲數據成員。當我的Stream上的Read方法被調用時,我會從我的一個文件流中讀取一些數據,並使用ZipOutputStream實例將壓縮數據寫入臨時存儲流,然後將該請求轉發給臨時存儲流。

這個臨時存儲流只是一個字節隊列。當這些字節被移入緩衝區(通過調用Read)時,它們將從隊列中被刪除。這樣,我只能存儲尚未讀取的字節。

不幸的是,它似乎當我處置一個ZipOutputStream它需要寫入隨機文件位置以創建一個有效的zip文件。這將阻止我使用我的「短暫數據」解決方案。

但願這一切清楚:)

有另一種方式創建壓縮文件時,最大限度地減少內存佔用?請幫忙!

謝謝!

回答

1

ZipOutputStream不需要寫入輸出流中的隨機位置(換句話說,撥打Seek())。但是如果您正在寫入的流報告它爲CanSeek,它將使用該功能更新某些標題。

所以,請確保您正在寫入的流返回falseCanSeek()並且一切都應該正常工作。

+0

您需要在ZipOutputStream上調用dispose()以使其生成有效的zip文件。如果不需要查找,那麼dispose()會做什麼? – Jordan 2012-02-07 20:46:36

+0

它與普通輸出流類似:需要刷新緩衝區。它還會寫入文件格式所需的頁腳。 – svick 2012-02-07 21:02:26

+0

這大部分工作...現在我已經修復了所有的錯誤。它看起來像我被迫在Ionic.Zip.CountingStream中包裝我的不可查找的流,以使其工作。任何想法爲什麼這是? – Jordan 2012-02-08 17:07:38