Архивирование файлов по размеру группы в каталоге - PullRequest
0 голосов
/ 14 сентября 2011

У меня есть 2 каталога, которые я должен открыть и сжать все файлы там. Моя проблема в том, что мои zip-файлы могут занимать всего 5 МБ каждый, и эти файлы большие. Я должен кое-как сгруппировать эти файлы по размеру, прежде чем архивировать их. Я хотел бы сделать это с помощью модуля Perl Archive :: Zip. У меня есть некоторый код, но мне было интересно, если кто-то здесь знает способ сделать это, ну вот код:

#!/perl/bin/perl -w
use strict;
use warnings;

use Archive::Zip qw/AZ_OK/;
use File::Temp qw/tempfile/;

use constant MB => 1024 * 1024;

#my @dir = '/dir1 dir2/';
my $dir = qw( dir1/);

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;



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;

}

print "Total archive size: $total bytes\n\n";

$zip->writeToFileNamed('zipped.zip') == AZ_OK or die $!;

Спасибо! * * 1004

1 Ответ

1 голос
/ 14 сентября 2011

ИМХО вы решаете не ту проблему. Если вам нужно сжать файлы в 5М куски, почему бы не сжать их все вместе, а затем разбить на 5М куски?

Вы можете выполнить внутреннее разбиение на perl (хороший пример: здесь ); или для менее портативного решения используйте системную команду split (доступно в Unix / Linux; есть также порт DOS )

...