2011-09-14 10 views
0

私はそこにすべてのファイルを開いてZipする必要がある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

perlを使用する必要があるのは何ですか?コマンドライン 'zip'ユーティリティには、特定のサイズでzipファイルを分割する' -s'スイッチがあります。 – Kevin

+0

はい、それは私が取り組んでいる現在のプログラムの一部になるので、Perlでなければなりません。 – Andre

答えて

1

IMHOあなたは間違った問題を解決しています。ファイルを5Mのチャンクに圧縮する必要がある場合は、それらをまとめて5Mのチャンクに分割してみましょう。

内部的に分割することができます(良い例はhereです)。または移植性の低いソリューションでは、システムコマンドsplit(Unix/Linuxで利用可能、DOS port as well

+0

私はそれをチャンクで行うことはできません。ファイルサイズで行う必要があります。ファイルを半分にすることはできません。 – Andre

+0

@Andre:1.最大のファイルが5Mを超えて圧縮されるとどうなりますか? – DVK

+0

@Andre:2.なぜ彼らは半減できないのか説明していただけますか? – DVK

関連する問題