这一定非常简单,而且这似乎是一个非常常见的问题,但我不能为我的生活找到一个“直截了当”的答案。
我想创建一个ProgressBar,显示由SharpZipLib提取的Zip文件。
FastZip和FastZipEvents类提供单个文件的进度,但不提供整个Zip中的位置。也就是说,如果Zip包含200个文件,则当前正在提取哪个文件。我不关心单个文件的进度(例如Foo.txt中的20KB到43KB)。
我想我可以通过首先创建一个ZipFile并访问Count属性来捏造一种方法。然后......使用ZipInputStream或FastZip自己提取和保持进度计数,但我认为这意味着Zip有效解压缩两次(一次完全进入内存),我不喜欢它。
任何干净的方式吗?
答案 0 :(得分:1)
关于你的最后一句话:“我认为这意味着Zip有效解压两次”。
读取zip文件的内容表根本不花费很多(并且不会访问包含的文件。你可能注意到当你查看带有“密码”的zip文件时只需要输入当您尝试提取文件时的密码。您可以查看条目/内容表。)
所以我认为首先检查索引/内容表,存储条目数(甚至可能是压缩/未压缩大小?)并稍后使用基于流的api的方法没有错。
答案 1 :(得分:0)
仅供参考: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,其中一个条显示存档的进度,另一个条显示存档中单个文件的进度。