【问题标题】:SharpZipLib - progress through fileS during extractSharpZipLib - 提取过程中文件的进度
【发布时间】:2009-12-22 15:22:24
【问题描述】:

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

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

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

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

有什么干净的方法吗?

【问题讨论】:

    标签: c# zip sharpziplib


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      仅供参考: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,其中一个栏显示存档的进度,另一个栏显示存档中单个文件的进度。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多