2 Stimmen

Entpacken von Zip-Dateien auf cmd mit Fortschrittsanzeige

Ich suche ein Programm, das in der Lage ist, Zip-Archive über die Windows-Befehlszeile zu entpacken und das in der Lage ist, einen Fortschrittsbalken oder eine Prozentanzeige auf der Befehlszeile anzuzeigen. Ich möchte es in einem Perl-Skript verwenden und so dem Benutzer einen Hinweis geben, wie lange der Vorgang dauern wird. Ich habe es mit 7zip (http://www.7-zip.org/) und Entpacken (von InfoZIP) konnte aber das oben beschriebene Verhalten nicht erzeugen. Weiß jemand, wie man das Problem lösen kann?

Aktualisieren: Derzeit versuche ich es mit diesem Ansatz:

#!/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;
}

Ich habe jedoch zwei Probleme:

  • dieser Ansatz scheint sehr langsam zu sein
  • Der Fortschrittsbalken wird nicht regelmäßig aktualisiert, sondern nur, wenn eine Datei fertig extrahiert ist. Da ich einige große Dateien habe, scheint das System beim Extrahieren nicht zu reagieren

1voto

daxim Punkte 38607

Führen Sie die Extraktion innerhalb Ihres Programms durch, anstatt sie an ein anderes Programm zu delegieren. Verwenden Sie Archiv::Zip y Begriff::ProgressBar . Extrahieren Sie eine Datei nach der anderen. Aktualisieren Sie den Fortschritt nach jeder Datei.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X