Mar*_*edy 2 directory perl zip archive
假设我有以下文件名数组,我希望压缩
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");
Run Code Online (Sandbox Code Playgroud)
当我打开zippedFolders.zip我看到它包含子文件夹,即Windows和Perl,后者实际上包含test1,test2和test3.出于某种原因,文件夹本身正在压缩.
我怎样才能使它只有文件被压缩而不必单击Windows然后Perl文件夹来访问压缩文件?
如您所见,如果您使用addFile将磁盘文件添加到存档,则Archive::Zip添加一个与文件原始路径相同的存档成员.如果您希望将其存储为不同的东西,则可以传递第二个参数,该参数将用作创建的归档成员的名称和路径.
出于您的目的,我建议您使用核心File::Basename模块从文件名中删除路径,并仅将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');
Run Code Online (Sandbox Code Playgroud)
产量
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"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1479 次 |
| 最近记录: |