2015-06-21 67 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'); 
相关问题