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时设置,并且Extract()在对ExtractAll()的调用范围内发生。
原因很简单:如果您在自己控制的循环中调用Extract(),图书馆无法知道您打算多少次调用它,连续调用了多少次,是否在接下来的5次中计数前5次,依此类推。 所以DotNetZip无法为您提供有关您完成了多少次的可靠信息。
您有两个简单的解决方法可用:
使用int计数器,您可以为循环中的每个对Extract()的调用增加一个计数器。
调用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");
}
链接地址: http://www.djcxy.com/p/52847.html