SharpZipLib - прохождение файлов в процессе извлечения - PullRequest
0 голосов
/ 22 декабря 2009

это должно быть действительно легко, и это, конечно, кажется очень часто задаваемым вопросом, но я не могу на всю жизнь найти "прямой" ответ.

Я хочу создать ProgressBar, который показывает Zip-файл, извлекаемый SharpZipLib.

Классы FastZip и FastZipEvents дают прогресс по отдельным файлам, но не по положению в общем Zip. То есть, если там Zip содержит 200 файлов, какой файл в настоящее время извлекается. Меня не волнует прогресс по отдельным файлам (например, от 20 КБ до 43 КБ в Foo.txt).

Я думаю, что я мог бы придумать способ сделать это, сначала создав ZipFile и получив доступ к свойству Count. А потом ... используя ZipInputStream или FastZip для извлечения и отслеживания прогресса, я думаю, что это означает, что Zip эффективно распаковывается дважды (один раз полностью в память), и мне это не нравится.

Есть ли чистый способ сделать это?

Ответы [ 2 ]

1 голос
/ 22 декабря 2009

Относительно вашего последнего предложения: «Я думаю, это означает, что Zip эффективно разархивируется дважды».

Чтение таблицы содержимого zip-файла вообще не требует больших затрат (и не позволяет получить доступ к содержащимся в нем файлам. Вы, вероятно, заметили это, когда смотрели zip-файл с «паролем» и его нужно было ввести только пароль при попытке извлечь файл . Вы можете посмотреть на таблицу записей / содержимого просто отлично).

Так что я не вижу ничего плохого в подходе первой проверки таблицы индекса / содержимого, сохранения количества записей (может быть, даже со сжатым / несжатым размером?) И использования API на основе потока позже.

0 голосов
/ 20 февраля 2010

FYI: 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:
            ....
        }
    }

Вы можете использовать его для управления знакомым интерфейсом с двумя индикаторами выполнения: одна строка отображает прогресс для архива, а другая - прогресс для отдельного файла в архиве.

...