SharpZipLib - 在提取过程中通过fileS进行处理

时间:2009-12-22 15:22:25

标签: c# zip sharpziplib

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

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

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

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

任何干净的方式吗?

2 个答案:

答案 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,其中一个条显示存档的进度,另一个条显示存档中单个文件的进度。