2011-05-24 53 views
7

ExtractProgressEventArgs.EntriesTotalExtractProgressEventArgs.EntriesExtracted始終爲零。這是一個已知的錯誤?見下面我的代碼:DotNetZip ExtractProgress錯誤?

public static void UnZip(string zipFile, string destination) 
{ 
    using(ZipFile zip = ZipFile.Read(zipFile)) 
    {     
     zip.ExtractProgress += new EventHandler<ExtractProgressEventArgs>(zip_ExtractProgress); 

     foreach (ZipEntry entry in zip) 
     { 
      entry.Extract(destination, ExtractExistingFileAction.OverwriteSilently);      
     } 
     Console.WriteLine("DONE"); 
    } 
} 

static void zip_ExtractProgress(object sender, ExtractProgressEventArgs e) 
{ 
    if(e.EventType == ZipProgressEventType.Extracting_AfterExtractEntry) 
     Console.WriteLine(String.Format("{0} : {1}/{2} = {3}%", e.CurrentEntry.FileName, e.EntriesTotal, e.EntriesExtracted, ((double)e.EntriesTotal/(double)e.EntriesExtracted) * 100.00)); 
} 
+0

爲什麼不能下載庫源,並做了調試會話? – Jaapjan 2011-05-24 11:08:44

+0

好點。那麼,如果這是一個確認的錯誤,我不會介意修復它。 :) – Ian 2011-05-24 11:11:08

回答

4

它定義的行爲:

http://cheeso.members.winisp.net/DotNetZipHelp/html/91d797c7-efff-99a3-2b14-6c9a9797b324.htm

EntriesExtracted至今提取的條目數。這僅在EventType爲Extracting_BeforeExtractEntry或Extracting_AfterExtractEntry時設置,並且Extract()在對ExtractAll()的調用範圍內發生。

這樣做的原因很簡單:如果你調用一個循環,你自己控制,有沒有辦法讓庫知道您打算如何多次調用它,你有多少次已經提取物()連續調用它,是否在接下來的5次中計數前5次,以此類推。所以DotNetZip無法爲您提供有關您完成了多少次的可靠信息。

你有兩個可用的解決方法簡便:

  • 使用你增量每次調用提取()在循環的int計數器。

  • 調用ExtractAll(),在這種情況下,它將發出ExtractProgressEvents並將EntriesExtracted值設置爲一個有意義的數字。

選項1:

int n; 
    using(ZipFile zip = ZipFile.Read(zipFile)) 
    {     
     zip.ExtractProgress += zip_ExtractProgress; 
     n = 0; 
     foreach (ZipEntry entry in zip) 
     { 
      n++; 
      entry.Extract(destination, ExtractExistingFileAction.OverwriteSilently);      
     } 
     Console.WriteLine("DONE"); 
    } 

選項2:

using(ZipFile zip = ZipFile.Read(zipFile)) 
    {     
     zip.ExtractProgress += zip_ExtractProgress; 
     zip.ExtractAll(destination, 
       ExtractExistingFileAction.OverwriteSilently);      
     Console.WriteLine("DONE"); 
    }