#!/usr/bin/perl use strict; use warnings; use 5.010; use Archive::Zip qw(:ERROR_CODES :CONSTANTS); if ($^O =~ /mswin/i) { $Archive::Zip::UNICODE = 1; } # Zufallsdateien erzeugen say '-' x 80; my $nr = 1; $nr ++ while -e "test$nr"; mkdir("test$nr"); for (my $fnr = 1; $fnr < 11; $fnr ++) { open(my $fh,'>',"test$nr/testdatei$fnr.txt"); my $count = int(rand((9000)+1))+100; for (my $x = 0; $x < $count; $x ++) { print $fh chr(int(rand((25)+1))+65); } close($fh); } # ZIPpen my $zip = Archive::Zip->new(); my $error = ''; Archive::Zip::setErrorHandler( # auskommentieren um das ursprüngliche sub{ # und jetzt gelöste Problem zu sehen chomp($_[0]); $error = "FEHLER '$_[0]'"; } ); mkdir('archive_zip_temp') if !-e 'archive_zip_temp'; Archive::Zip::tempFile('archive_zip_temp'); my @pfade = ("test$nr"); my $flag = 0; # 0=wilde Fehlermeldungen erzeugen / sonst 1 while (scalar @pfade) { my $pfad = shift @pfade; if (opendir(my $fh,$pfad)) { foreach my $file (sort {$a cmp $b} readdir $fh) { next if $file eq '.' || $file eq '..'; if (-d "$pfad/$file") { push @pfade,"$pfad/$file"; } else { if (open(my $t,'<',"$pfad/$file")) { close($t); my $file_member = $zip->addFile({ filename => "$pfad/$file", compressionLevel => 7, }); if (!$flag) { unlink("$pfad/$file"); # mitten im Vorgang Dateien entziehen... $flag = 1; } say "add '$pfad/$file'"; } else { say "$pfad/$file nicht lesbar" } } } } else { say "$pfad -> $! in ".__LINE__.' -> wird ignoriert, darum geht es im Moment nicht'; } } say '-' x 80; say "Endergebnis: ".$zip->writeToFileNamed('test.zip'); say '-' x 80; if ($error ne '') { say $error; } else { say 'OK'; }