2015-06-21 70 views
1

我想使用Archive :: Zip壓縮圖像文件。這些文件在數據/溫度/文件中當我循環訪問目錄中的日誌並將它們添加到zip文件時,當我只想要圖像文件時,最終會生成文件夾層次結構和圖像文件。如何只壓縮文件,而不是完整路徑

所以zip結束含有:

Data 
    └Temp 
    └Files 
     └Image1.jpg 
     Image2.jpg 
     Image3.jpg 

當我想的zip文件包含的是:

Image1.jpg 
Image2.jpg 
Image3.jpg 

這裏是我運行與測試腳本:

#!/usr/bin/perl 
use Archive::Zip; 

$obj = Archive::Zip->new(); # new instance 

@files = <Data/Temp/Files/*>; 

foreach $file (@files) { 
    $obj->addFile($file); # add files 
} 

$obj->writeToFileNamed("Data/Temp/Files/Images.zip"); 

回答

2

使用chdir更改爲目錄:

use Archive::Zip; 

$obj = Archive::Zip->new(); # new instance 

chdir 'Data/Temp/Files'; 
@files = <*>; 

foreach $file (@files) { 
    $obj->addFile($file); # add files 
} 

$obj->writeToFileNamed("Images.zip"); 
+1

最好加上'使用嚴格的;使用警告;' – Nasser

+1

我不認爲用*「new instance」*評論對'new'的調用,並且用*「添加文件」調用addFile *會幫助任何人 – Borodin

2

zip存檔成員的名稱和路徑完全獨立於其真實文件副本的名稱和路徑。儘管這兩個名稱通常是相同的,但是AddFile允許您指定第二個參數,該參數是應存儲文件信息的相應存檔成員的名稱和路徑

您可以實現您要求的效果使用來自File::Basename模塊的basename從完整路徑中僅提取文件名稱

該程序演示。需要注意的是必不可少use strictuse warnings在每一個Perl程序的頂部,你寫

use strict; 
use warnings; 

use Archive::Zip; 
use File::Basename 'basename'; 

my $zip = Archive::Zip->new; 

for my $jpg (glob 'Data/Temp/Files/*.jpg') { 
    $zip->addFile($jpg, basename($jpg)); 
} 

$zip->writeToFileNamed('Data/Temp/Files/Images.zip'); 
相關問題