c# WPF检测提取完成与DotNetZip

本文关键字:DotNetZip 提取 WPF 检测 | 更新日期: 2023-09-27 18:04:48

我一直在尝试使用Ionic.Zip (DotNetZip)通过程序提取下载的zip文件。但是当我试图检测提取过程何时完成时,我卡住了。库包含ExtractProgress事件,因此我尝试通过进度条检测它,但它基于每个条目作为单个条目更新进度条,而不是将zip作为一个整体。因此,一旦解压缩第一个文件条目,它将认为它"完成"。有人知道一种方法来检测提取整个zip完成与DotNetZip?

c# WPF检测提取完成与DotNetZip

从DotNetZip Codeplex上的示例快速扫描来看,您每次解压一个项目。要向用户报告进度,使用BackgroundWorker,如下所示。

public void ExtractFile(string zipToUnpack, string unpackDirectory)
{
    BackgroundWorker worker = new BackgroundWorker();
    worker.WorkerReportsProgress = true;
    worker.ProgressChanged += (o, e) => { Console.WriteLine("Percent completed:" + e.ProgressPercentage); };
    worker.DoWork += (o, e) =>
    {
        using (ZipFile zip = ZipFile.Read(zipToUnpack))
        {  
            int step = (zip.Count / 100.0);
            int percentComplete = 0;
            foreach (ZipEntry file in zip)
            {
                file.Extract(unpackDirectory, ExtractExistingFileAction.OverwriteSilently);
                percentComplete += step;
                worker.ReportProgress(percentComplete);
            }
        }
    };
    worker.RunWorkerAsync();
}

另外,只要看看Codeplex上的源代码,它是一个相当完整的产品,所以应该有很多方法来实现你想要的;我所给的只是其中之一。

HTH,

如果你有这样的代码:

using (var zip = ZipFile.Read("whatever.zip"))
{
    zip.ExtractProgress += MyExtractProgress;
    numEntries = zip.Entries.Count;
    foreach (var e in zip) 
    {
        e.Extract();
    }
}

…您将获得提取进度事件。extractprogressevenargs类记录在这里。在事件args类中,有一个EventType字段,它描述了您收到的事件。这里描述了这些类型。

对于条目,在提取开始前(), 在提取完成后()(对于条目)有事件类型。如果您想要跟踪到那个级别,还有一种事件类型会为每个解压缩的数据块触发。正因为如此,您可以为特定提取获得数千个事件。如果您跟踪条目的数量,那么您就知道预期有多少"after"事件,并且您可以在接收到适当数量的after事件时声明提取完成。

如果在循环中提取每个条目,则库不能发出"extract is completed"事件,如上所示。这是因为它不知道你是否会继续循环到最后,或者可能在中间停止。它不可能知道。

如果调用zip.ExtractAll(),像这样:

using (var zip = ZipFile.Read("whatever.zip"))
{
    zip.ExtractProgress += MyExtractProgress;
    zip.ExtractAll(extractDirectory);
}

…然后DotNetZip将发出"所有条目已被提取"事件类型。我在上面提供的文档链接中也描述了这一点。

所以你有一些选择

有一个事件类型叫做Extracting_AfterExtractAll你可以用它来检查ExtractAll操作是否完成:

http://www.nudoq.org/# !/包/DotNetZip/Ionic.Zip ZipProgressEventType/F/Extracting_AfterExtractAll

    private void UnZipFile(zipFilePath)
    {
        using (ZipFile zip = new ZipFile(zipFilePath))
        {
            zip.ExtractProgress += zip_ExtractProgress;
            zip.ExtractAll(Path.GetDirectoryName(zipFilePath));
        }
    }
    static void zip_ExtractProgress(object sender, ExtractProgressEventArgs e)
    {
        if (e.EventType == ZipProgressEventType.Extracting_AfterExtractAll)
            zipExtractFinished = true;
    }

与其使用你自己的worker ..还有提交者提到的ExtractProgress事件,另外还可以查询zip文件中的项目数量。将这两者结合起来,你便拥有了自己的进程事件和追踪进程的能力。答:没有事件表示提取结束。