Thread Archive::Zip Umlaute auf Windows (14 answers)
Opened by bianca at 2016-05-01 10:57

bianca
 2016-05-05 09:10
#184686 #184686
User since
2009-09-13
6977 Artikel
BenutzerIn

user image
Da sich Fred nicht zurück meldet habe ich erstmal eine alternative Lösung mit 7-Zip gebaut.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Encode;

###########################################################
# Def
my @pfade = ("test_archive_broschüre");            # Quelle(n)
my $ziel_zip = 'test.zip';                      # Zieldatei
my $siebenzip = 'c:/programme/7-zip/7z.exe';    # Installationsort 7-Zip
my $comp_rate = 9;                              # Komprimierungsgrad
                                                # von 0/garnicht+schnell bis 9/stark+langsam

###########################################################
# Pre
say("\n\n\n".('-' x 80)."\ngeht los");
close(STDERR);  # alternativ umleiten je nach Einsatzort
# 7-Zip gibt Fehler auf STDERR und STDOUT aus
# und da STDOUT schon geholt wird brauchen wir STDERR nicht auch noch
my $output = `"$siebenzip" -h`;
if ($output =~ /^7-zip \[(\d\d)\] (\d+)\.(\d+).+(\d\d\d\d)-(\d\d)-(\d\d)$/im) {
    say("Installierte Version von 7-Zip: $2.$3 vom $6.$5.$4 in $1 Bit Architektur");

    if (!-f $ziel_zip || unlink($ziel_zip)) {
        $_ =~ s/\//\\/g for @pfade;
        my $quellen = '"'.join('" "',@pfade);
        $quellen .= ($quellen !~ /\\$/ && $quellen !~ /\*$/? '\\' : '')
            .($quellen !~ /\*\.\*$/ ? '*.*' : '');
        my $kommando = join(' ',(
            '"'.$siebenzip.'"',
            'a',                # add / hinzufügen
            '-r',               # recurse / Unterverzeichnisse einschließen
            "-mx=$comp_rate",   # set compression Method / Komprimierungsstärke
            $ziel_zip,
            $quellen,
        ));
        $output = `$kommando`;
        my $regex_mit_verz = qr{
Scanning the drive:
(\d+) folder([s]?), (\d+) file([s]?), (\d+) bytes(.*)

Creating archive: $ziel_zip

Items to compress: (\d+)


Files read from disk: (\d+)
Archive size: (\d+) bytes(.+)
Everything is Ok
}m;
        my $regex_ohne_verz = qr{
Scanning the drive:
(\d+) file([s]?), (\d+) bytes(.*)

Creating archive: $ziel_zip

Items to compress: (\d+)


Files read from disk: (\d+)
Archive size: (\d+) bytes(.+)
Everything is Ok
}m;
        my $fertig = sub {
            my ($ma) = @_;
            my ($quelle_verz,$quelle_dateien,$quelle_bytes,$ziel_anz_gesamt,$ziel_bytes);
            if (scalar(@$ma) == 10) {
                $quelle_verz = $ma->[0];
                $quelle_dateien = $ma->[2];
                $quelle_bytes = $ma->[4];
                $ziel_anz_gesamt = $ma->[6];
                $ziel_bytes = $ma->[8];
            }
            else {
                $quelle_verz = 0;
                $quelle_dateien = $ma->[0];
                $quelle_bytes = $ma->[2];
                $ziel_anz_gesamt = $ma->[4];
                $ziel_bytes = $ma->[6];
            }
            if ($quelle_verz + $quelle_dateien == $ziel_anz_gesamt) {
                if ($quelle_bytes) {
                    my $rate = int(100 / $quelle_bytes * $ziel_bytes);
                    if ($rate != 100) {
                        say("Komprimierung erfolgte, das ZIP betraegt $rate % von der Summe der"
                            ." Ursprungsgroesse aller Dateien ($ziel_bytes von $quelle_bytes Byte)");
                    }
                    else {
                        say("Es wurde keine (nennenswerte) Komprimierung durchgefuehrt");
                    }
                }
                else {
                    say("In dem/den Quellverzeichnis/-sen wurde/-n keine Datei/-en gefunden");
                    if (!$ziel_anz_gesamt) {
                        say("Das ZIP ist leer");
                    }
                }
            }
            else {
                say("Fehler in ".__LINE__.": $quelle_verz Verzeichnis/-se + $quelle_dateien"
                    ." Datei/-en != $ziel_anz_gesamt Element/-e");
                exit();
                # die() ist hier nicht angezeigt, weil dessen Text auf STDERR
                # gehen würde, was wir aber oben geschlossen hatten
            }
        };
        if ($output =~ $regex_mit_verz || $output =~ $regex_ohne_verz) {
            my @matches = map {;no strict 'refs'; $$_} 1 .. $#-;
            # $matches[0] = $1  $matches[1] = $2  $matches[2] = $3 usw.
            # Quelle: http://www.perlmonks.org/?node_id=959528
            $fertig->(\@matches);
        }
        else {
            say("Fehler in ".__LINE__.":\n$output\n");
            exit();
        }
    }
    else {
        say("Fehler in ".__LINE__);
        exit();
    }
}
else {
    say("Fehler in ".__LINE__);
    exit();
}

###########################################################
# End
say("Fertig\n".('-' x 80));

Das ist nur ein Gerüst. Detailliertere Fehlerabfragen etc. müssen noch vom Nutzer vorgenommen werden.
Vereinfachungen, Korrekturen etc. sind herzlich Willkommen
Wünsche allen einen sonnenreichen Feiertag!

Editiert von bianca: Korrekturen aus dem Dialog mit MarkusH
Last edited: 2016-05-07 07:51:44 +0200 (CEST)
10 print "Hallo"
20 goto 10

View full thread Archive::Zip Umlaute auf Windows