http://www.perlmonks.org?node_id=926155

Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi there Monks!
I am looking all over for something like this code, but I still can't figure this one out, I need to zip files inside directories but the zip file can not be larger than 5MB each, but all the files inside of these directories will be more than that, I need to find a way to create multiple .zips files in case I read directories and the sum of files is greater than 5MB zipped. This code is almost there but I am stuck on the logic of making multiple zips if necessary.
Here is the code and thanks for the help!
#!/usr/bin/perl -w use strict; use Archive::Zip qw/AZ_OK/; use File::Temp qw/tempfile/; use constant MB => 1024 * 1024; my $dir = qw( zip_this/); my @files = do { opendir my $fd, "$dir" or die $! or die $!; grep -f, map "$dir$_", readdir $fd; }; my $zip = Archive::Zip->new; my $total; my $limit = 5*MB; my $FileCount = 0; foreach my $file (@files) { my $temp = Archive::Zip->new; my $member = $temp->addFile($file); next unless $member->compressedSize; my $fh = tempfile(); $temp->writeToFileHandle($fh) == AZ_OK or die $!; $zip->addMember($member); $total += $member->compressedSize; #die "$total bytes exceeds archive size limit" if $total > $limit; my $new_total; if($total > $limit) { $FileCount++; $total = $total/2; print "\n$filecount - $total - $file\n\n"; } #die "$total bytes exceeds archive size limit" if $total > $limit; } print "Total archive size: $total bytes\n\n"; $zip->writeToFileNamed('zipped.zip') == AZ_OK or die $!;
Thanks!