0

这必须非常简单,而且这似乎是一个非常常见的问题,但我一生都找不到“直截了当”的答案。

我想创建一个 ProgressBar,显示 SharpZipLib 正在提取的 Zip 文件。

FastZip 和 FastZipEvents 类提供单个文件的进度,但不提供整个 Zip 中的位置。也就是说,如果 Zip 包含 200 个文件,那么当前正在提取什么文件。我不关心单个文件的进度(例如 Foo.txt 中的 20KB 到 43KB)。

我想我可以通过首先创建一个 ZipFile 并访问 Count 属性来捏造一种方法。然后......使用 ZipInputStream 或 FastZip 来提取并保持进度计数,但我认为这意味着 Zip 被有效地解压缩了两次(一次完全进入内存),我不喜欢那样。

有什么干净的方法吗?

4

2 回答 2

1

关于你的最后一句话:“我认为这意味着 Zip 被有效地解压缩了两次”。

读取 zip 文件的内容表根本不会花费太多(并且不会访问包含的文件。您可能注意到,当您查看带有“密码”的 zip 文件并且只需要输入密码时您尝试提取文件。您可以查看条目/内容表就好了)。

因此,我认为首先检查索引/内容表、存储条目计数(甚至可能使用压缩/未压缩大小?)并稍后使用基于流的 api 的方法没有任何问题。

于 2009-12-22T16:10:27.500 回答
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-progressbar UI,其中一个栏显示存档的进度,另一个栏显示存档中单个文件的进度。

于 2010-02-19T21:14:38.677 回答