Perl Archive :: Zip创建不必要的文件夹

时间:2013-05-13 02:37:15

标签: perl zip archive directory

假设我有以下文件名数组,我希望压缩

my @files = ("C:\Windows\Perl\test1.txt", "C:\Windows\Perl\test2.txt", "C:\Windows\Perl\test3.txt");

如果我这样做

$obj = Archive::Zip->new(); 
foreach (@files)
 {
    $obj->addFile($_);   
 }

$obj->writeToFileNamed("zippedFolders.zip");

当我打开zippedFolders.zip时,我发现它包含子文件夹,即WindowsPerl,后者实际上包含test1test2和{{1} }。出于某种原因,文件夹本身正在压缩。

如何才能使文件只被压缩,而不必点击Windows然后点击Perl文件夹来访问压缩文件?

1 个答案:

答案 0 :(得分:7)

如您所见,如果您使用addFile将磁盘文件添加到存档,则Archive::Zip会添加一个存档成员,其路径与文件最初的路径相同。如果您希望将其存储为不同的内容,则可以传递第二个参数,该参数将用作创建的存档成员的名称和路径。

出于您的目的,我建议您使用核心File::Basename模块从文件名中删除路径,并仅将基本名称作为第二个参数传递。

以下代码演示。

你需要注意的是,你不能在Perl双引号中使用单个反斜杠 - 它们将被视为转义后续字符并简单地消失。您可以在字符串中使用反斜杠对,改为使用单引号,而是使用正斜杠(Perl会对事物进行排序)或者如果文件名中没有空格,那么您可以像我在此程序中使用qw()一样

use strict;
use warnings;

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

my @files = qw/
  C:\Windows\Perl\test1.txt
  C:\Windows\Perl\test2.txt
  C:\Windows\Perl\test3.txt
/;

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

foreach my $file (@files) {
  my $member = basename $file;
  printf qq{Adding file "%s" as archive member "%s"\n}, $file, $member;
  $zip->addFile($file, $member);   
}

$zip->writeToFileNamed('zippedFolders.zip');

<强>输出

Adding file "C:\Windows\Perl\test1.txt" as archive member "test1.txt"
Adding file "C:\Windows\Perl\test2.txt" as archive member "test2.txt"
Adding file "C:\Windows\Perl\test3.txt" as archive member "test3.txt"