我一直在尝试使用Ionic.Zip (DotNetZip)通过程序提取下载的zip文件。但是当我试图检测提取过程何时完成时,我卡住了。库包含ExtractProgress事件,因此我尝试通过进度条检测它,但它基于每个条目作为单个条目更新进度条,而不是将zip作为一个整体。因此,一旦解压缩第一个文件条目,它将认为它"完成"。有人知道一种方法来检测提取整个zip完成与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文件中的项目数量。将这两者结合起来,你便拥有了自己的进程事件和追踪进程的能力。答:没有事件表示提取结束。