C # WPF Обнаружение завершения извлечения с помощью DotNetZip? - PullRequest
2 голосов
/ 07 августа 2011

Я пытался работать с Ionic.Zip (DotNetZip) для извлечения загруженных файлов ZIP через программу. Но я застреваю при попытке определить, когда процесс извлечения завершен. Библиотека содержит событие ExtractProgress, поэтому я попытался обнаружить его через индикатор выполнения, но он обновляет индикатор выполнения на основе каждой записи как отдельной записи, а не как zip в целом. Поэтому, как только первая запись в файле будет разархивирована, она будет считаться завершенной. Кто-нибудь знает способ обнаружить извлечение полного zip-завершения с помощью DotNetZip?

Ответы [ 4 ]

3 голосов
/ 07 августа 2011

При быстром сканировании примеров на DotNetZip Codeplex кажется, что вы распаковываете 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, и это довольно полный продукт, поэтому должно быть много способов для достижения того, что вы хотите; то, что я дал, является только одним из них.

НТН,

2 голосов
/ 09 августа 2011

Если у вас есть такой код:

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

... вы получите извлеченные события прогресса.Класс ExtractProgressEventArgs документирован здесь .В классе args события есть поле EventType, которое описывает, какое событие вы получили.Эти типы описаны здесь .

Существуют типы событий для до начала извлечения для записи, после завершения извлечения (для записи).Существует также тип события, который запускается для каждого фрагмента данных, которые распаковываются, если вы хотите отслеживать до этого уровня.Благодаря этому Вы можете получить тысячи событий для конкретного извлечения.Если вы отслеживаете количество записей, то вы знаете, сколько «после» событий ожидать, и вы можете объявить извлечение завершенным, когда вы получили соответствующее число после событий.

Библиотека не может выдать событие «извлечение завершено», если вы извлекаете каждую запись в цикле, как я показал выше.Это потому, что он не знает, продолжите ли вы цикл до конца или, возможно, остановитесь посередине.Это не может знать.

Если вы вызываете zip.ExtractAll (), например:

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

..., тогда DotNetZip выдаст тип события «все записи были извлечены».Это также описано в ссылках документации, которые я предоставил выше.

Итак, у вас есть несколько вариантов.

1 голос
/ 01 июля 2015

Существует EventType с именем Extracting_AfterExtractAll , который можно использовать для проверки завершения операции ExtractAll:

http://www.nudoq.org/#!/Packages/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;
    }
0 голосов
/ 08 августа 2011

Вместо того, чтобы использовать свой собственный рабочий для этого ... есть также событие ExtractProgress, на которое ссылался отправитель, плюс можно запросить количество элементов в zip-архиве. Объедините эти два, и вы получите свое событие прогресса и возможность отслеживать прогресс по общему количеству предметов. AFAIK, нет события, которое указывает на конец извлечения.

...