DotNetZip ExtractProgress错误?

|
ExtractProgressEventArgs.EntriesTotal
ExtractProgressEventArgs.EntriesExtracted
始终为零。这是一个已知的错误?请参阅下面的代码:
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));
}
    
已邀请:
它的定义行为是: 来自http://cheeso.members.winisp.net/DotNetZipHelp/html/91d797c7-efff-99a3-2b14-6c9a9797b324.htm   EntriesExtracted到目前为止提取的条目数。仅当EventType为Extracting_BeforeExtractEntry或Extracting_AfterExtractEntry,并且在对ExtractAll()的调用范围内发生Extract()时,才进行设置。 原因很简单:如果您在自己控制的循环中调用Extract(),则库将无法知道您打算调用多少次,调用了多少次。连续计算是否先计算前5次,再计算接下来的5次,依此类推。因此,DotNetZip无法为您提供有关您已完成多少工作的可靠信息。 您有两种简单的解决方法: 对循环中对Extract()的每次调用使用一个递增的int计数器。 调用ExtractAll(),在这种情况下,它将发出ExtractProgressEvents,并将“ 3”值设置为有意义的数字。 选项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\");
    }
    

要回复问题请先登录注册