Распакуйте zip файлы на cmd с индикатором прогресса - PullRequest
2 голосов
/ 13 января 2011

Я ищу программу, способную извлекать zip-архивы через командную строку Windows и отображать индикатор выполнения или процентный показатель в cmd. Я хочу использовать это из скрипта Perl и дать подсказку пользователю, сколько времени займет прогресс. Я пробовал 7zip (http://www.7 -zip.org /) и Unzip (из InfoZIP) , но не смог произвести поведение, описанное выше. Кто-нибудь знает, как это решить?

Обновление: В настоящее время я пробую это с таким подходом:

#!/usr/bin/perl 
use strict; $|++;
use warnings;

use Archive::Zip;

my $zip = Archive::Zip->new('file.zip');
my $total_bytes = 0;
my $bytes_already_unzipped = 0;

foreach my $member ($zip->members()) {
    $total_bytes += $member->uncompressedSize();
}
foreach my $member ($zip->members()) {  
    $zip->extractMember($member);
    $bytes_already_unzipped += $member->uncompressedSize();
    print progress_bar($bytes_already_unzipped, $total_bytes, 25, '=' );
}

#routine by tachyon at http://tachyon.perlmonk.org/
#also have a look at http://oreilly.com/pub/h/943
sub progress_bar {
    my ( $got, $total, $width, $char ) = @_;
    $width ||= 25; $char ||= '=';
    my $num_width = length $total;
    sprintf "|%-${width}s| Got %${num_width}s bytes of %s (%.2f%%)\r", 
        $char x (($width-1)*$got/$total). '>', 
        $got, $total, 100*$got/+$total;
}

Однако у меня есть две проблемы:

  • этот подход кажется очень медленным
  • У меня нет периодического обновления в индикаторе выполнения, но только после завершения извлечения файла. Поскольку у меня есть несколько больших файлов, система, похоже, не отвечает при их извлечении

1 Ответ

1 голос
/ 13 января 2011

Делайте извлечение из вашей программы вместо делегирования другой. Используйте Archive :: Zip и Term :: ProgressBar . Извлекайте файлы один за другим. Обновляйте прогресс после каждого.

...