在目录中按组大小压缩文件

时间:2011-09-14 18:13:24

标签: perl zip archive

我有2个目录,我必须打开并压缩所有文件。我的问题是我的zip文件每个只能是5MB,而且这些文件很大。我必须在压缩它们之前如何按大小对这些文件进行分组。我想用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 $!;

谢谢!

1 个答案:

答案 0 :(得分:1)

恕我直言,你正在解决错误的问题。如果你需要将文件压缩成5M块,为什么不将它们全部压缩然后分成5M块呢?

你可以在内部拆分perl(一个很好的例子是here);或者对于不太便携的解决方案,使用系统命令split(在Unix / Linux上可用;有一个DOS port as well