Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#WPF使用DotNetZip检测提取完成?_C#_Wpf_Extraction_Dotnetzip - Fatal编程技术网

C#WPF使用DotNetZip检测提取完成?

C#WPF使用DotNetZip检测提取完成?,c#,wpf,extraction,dotnetzip,C#,Wpf,Extraction,Dotnetzip,我一直在尝试使用Ionic.Zip(DotNetZip)通过一个程序提取下载的Zip文件。但当我试图检测提取过程何时完成时,我被卡住了。该库包含一个ExtractProgress事件,因此我尝试通过进度条检测它,但它会将每个条目作为单个条目而不是整个zip更新进度条。因此,一旦第一个文件条目被解压缩,它会认为它是“完成”。有人知道用DotNetZip检测整个zip完成提取的方法吗?通过快速扫描屏幕上的示例,您可以一次打开一个zip项目。要向用户报告进度,请像这样使用BackgroundWorke

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

通过快速扫描屏幕上的示例,您可以一次打开一个zip项目。要向用户报告进度,请像这样使用
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,

而不是使用您自己的工人进行此操作。。还有提交者提到的ExtractProgress事件,另外还可以查询zip中的项目数。将这两者结合起来,您就有了进度事件,并能够根据项目总数跟踪进度。AFAIK没有表示提取结束的事件。

如果您有这样的代码:

using (var zip = ZipFile.Read("whatever.zip"))
{
    zip.ExtractProgress += MyExtractProgress;
    numEntries = zip.Entries.Count;
    foreach (var e in zip) 
    {
        e.Extract();
    }
}
using (var zip = ZipFile.Read("whatever.zip"))
{
    zip.ExtractProgress += MyExtractProgress;
    zip.ExtractAll(extractDirectory);
}
…您将获得提取进度事件。ExtractProgressEventArgs类已记录在案。 在event args类中,有一个EventType字段,用于描述您收到的事件。对这些类型进行了描述

对于条目,在提取开始之前、提取完成之后(对于条目),存在事件类型。还有一种事件类型,如果您希望跟踪到该级别,它会为每个解压缩的数据块触发。因此,您可以为特定提取获取数千个事件。如果您跟踪条目的数量,那么您就知道预期的“after”事件数量,并且当您收到适当数量的after事件时,您可以声明提取已完成

如果您正在提取循环中的每个条目,则库无法发出“提取完成”事件,如我上面所示。这是因为它不知道你是否会继续你的循环到最后,或者在中间停止。它不可能知道

如果调用zip.ExtractAll(),如下所示:

using (var zip = ZipFile.Read("whatever.zip"))
{
    zip.ExtractProgress += MyExtractProgress;
    numEntries = zip.Entries.Count;
    foreach (var e in zip) 
    {
        e.Extract();
    }
}
using (var zip = ZipFile.Read("whatever.zip"))
{
    zip.ExtractProgress += MyExtractProgress;
    zip.ExtractAll(extractDirectory);
}
…然后DotNetZip将发出“所有条目均已提取”事件类型。我在上面提供的文档链接中也描述了这一点


因此您有一些选项。

有一个名为Extraction\u AfterExtractAll的事件类型,您可以使用它来检查ExtractAll操作是否完成:


您可能应该显示一些您所看到的代码done@Cheeso:我刚刚修复了示例中的一个编译错误:
worker.ProgressChanged+=(o,e){Console
应该是
worker.ProgressChanged+=(o,e)=>{Console
。MyExtractProgress到底是什么,顺便说一句,它给了我一个错误:Zipfile不包含“读取”的定义