gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:35:57 25 4
gpt4 key购买 nike

假设我有以下要压缩的文件名数组

我的@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,后者实际上包含 test1test2test3。出于某种原因,文件夹本身正在压缩。

我怎样才能只压缩文件,而不必依次单击 Windows 和 Perl 文件夹来访问压缩文件?

最佳答案

如您所见,如果您使用 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"

关于Perl Archive::Zip 创建不必要的文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16514125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com