【问题标题】:DotNetZip ExtractProgress Bug?DotNetZip ExtractProgress 错误?
【发布时间】:2011-05-24 10:59:44
【问题描述】:

ExtractProgressEventArgs.EntriesTotalExtractProgressEventArgs.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));
}

【问题讨论】:

  • 为什么不下载库源并进行调试会话?
  • 好点。好吧,如果这是一个已确认的错误,我不介意修复它。 :)

标签: c# .net dotnetzip


【解决方案1】:

已定义的行为:

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

EntriesExtracted 到目前为止提取的条目数。仅当 EventType 为 Extracting_BeforeExtractEntry 或 Extracting_AfterExtractEntry 并且 Extract() 发生在对 ExtractAll() 的调用范围内时才设置此设置。

原因很简单:如果您在自己控制的循环中调用 Extract(),则库无法知道您计划调用它多少次,调用了多少次一行,是否计算前5次与后5次,以此类推。因此,DotNetZip 无法为您提供有关您完成了多少的可靠信息。

您有两种简单的解决方法:

  • 使用一个 int 计数器,在循环中每次调用 Extract() 时递增该计数器。

  • 调用 ExtractAll(),在这种情况下,它将发出带有 EntriesExtracted 值设置为有意义的数字的 ExtractProgressEvents。

选项 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");
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多