Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 按目录中的组大小压缩文件_Perl_Zip_Archive - Fatal编程技术网

Perl 按目录中的组大小压缩文件

Perl 按目录中的组大小压缩文件,perl,zip,archive,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/;

我有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 $!;

谢谢

我知道你是在解决错误的问题。如果您需要将文件压缩成5百万个块,为什么不将它们全部压缩在一起,然后分割成5百万个块呢


您可以在perl内部进行拆分(一个很好的例子是);或者对于可移植性较差的解决方案,使用系统命令(在Unix/Linux上可用;有一个)

您需要使用perl的原因是什么?命令行
zip
实用程序有一个
-s
开关,可以按特定大小分割zip文件。是的,它必须是Perl格式的,因为它将是我正在处理的当前程序的一部分。我不能分块执行,我必须按文件大小执行,不能将任何文件切成两半。@Andre:1。当最大的文件压缩到>5M时会发生什么?@Andre:2。你能解释一下为什么不能把它们切成两半吗?我必须用FTP传输这些zip文件,其中一个要求是,如果压缩目录中的文件不能超过5MB,如果是,我需要将其压缩成5MB的zip文件。假设这两个目录将有13MB的zip文件。我需要计算一下,制作两个5MB的zip文件和一个3MB的zip文件,然后用FTP将它们全部传输出去。@Andre-你没有回答我的问题。很明显,为什么每个文件都需要