2011-09-14 46 views
0

我有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'實用程序有一個'-s'開關,可將zip文件分割成特定的大小。 – Kevin

+0

是的,它必須在Perl中,因爲它將成爲我正在開發的當前程序的一部分。 – Andre

回答

1

恕我直言,你正在解決錯誤的問題。如果你需要將文件壓縮成5M塊,爲什麼不把它們一起壓縮,然後分成5M塊?

你可以在內部進行分割到perl(一個很好的例子是here);或用於較少便攜式解決方案使用系統命令split(在Unix/Linux上可用;有一個DOS port as well

+0

我不能做大塊,我必須做到文件大小,我不能有任何文件減半。 – Andre

+0

@Andre:1.當最大的文件壓縮到大於5M的東西時會發生什麼? – DVK

+0

@Andre:2.你能解釋爲什麼他們不能削減一半嗎? – DVK

相關問題