2009-12-22 42 views
0

過程中,通過文件的進展這必須是非常容易,而且它肯定似乎是一個很常見的問題,但我不能爲我的生活找到一個「簡單」的答案。SharpZipLib - 提取

我想創建一個ProgressBar,顯示SharpZipLib提取的Zip文件。

FastZip和FastZipEvents類在單個文件上給出進度,但不在整個Zip中的位置上。也就是說,如果Zip包含200個文件,那麼當前正在提取哪個文件。我不關心通過單個文件的進度(例如,Foo.txt中的20KB到43KB)。

我想我可以通過首先創建ZipFile並訪問Count屬性來做到這一點。然後...使用ZipInputStream或FastZip提取並保持自己的進度,但我認爲這意味着Zip有效地解壓縮兩次(一次完全存入內存),我不喜歡這樣。

這樣做的任何干淨的方式?

回答

1

關於你的最後一句話:「我認爲,這意味着郵編有效地解壓縮兩次」。

讀取壓縮文件的內容表並不會花費太多(並且不訪問包含的文件。您可能注意到,當您查看帶有「密碼」的zip文件並且只需要輸入密碼時,你試圖提取文件。你可以看一下條目/內容表就好了)。

因此,我認爲沒有錯的第一個檢查索引/內容表,存儲條目計數的方法(甚至用壓縮/解壓縮大小?),後來使用流基於API。

0

FYI:DotNetZip有這樣的事情ExtractProgress事件。代碼:

using (ZipFile zip = ZipFile.Read(ExistingZipFile)) 
{ 
    zip.ExtractProgress = MyExtractProgress; 
    zip.ExtractAll(TargetDirectory);  
} 

的extractprogress處理程序是這樣的:

private void MyExtractProgress(object sender, ExtractProgressEventArgs e) 
    { 
     switch (e.EventType) 
     { 
      case ZipProgressEventType.Extracting_BeforeExtractEntry: 
      .... 
      case ZipProgressEventType.Extracting_EntryBytesWritten: 
      ... 
      case ZipProgressEventType.Extracting_AfterExtractEntry: 
      .... 
     } 
    } 

你可以用它來驅動熟悉的2-進度UI,一個酒吧顯示存檔進度,並顯示進度另一欄用於存檔中的單個文件。