Perl Archive::Zip 创建不必要的文件夹
Posted
技术标签:
【中文标题】Perl Archive::Zip 创建不必要的文件夹【英文标题】:Perl Archive::Zip creates unnecessary folders 【发布时间】:2013-05-13 02:37:14 【问题描述】:假设我有以下要压缩的文件名数组
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 时,我看到它包含子文件夹,即 Windows
和 Perl
,后者实际上包含 test1
、test2
和 test3
。出于某种原因,文件夹本身正在被压缩。
我怎样才能使只有文件被压缩,而不必单击 Windows 和 Perl 文件夹来访问压缩文件?
【问题讨论】:
【参考方案1】:如您所见,如果您使用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 qqAdding 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"
【讨论】:
非常酷...但是我的 $member = basename $file 行出现错误。编译器正在寻找有效的路径名 如果您收到错误,您应该发布它们以便我们查看。 如果您不告诉我错误是什么,以及您正在使用的$file
的值是什么,我无法帮助您。以上是关于Perl Archive::Zip 创建不必要的文件夹的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 perl Archive::Zip 将文件添加到存档中?
Archive::Zip 无法在 Perl 中创建 Zip 对象