【问题标题】:Perl Archive::Zip creates unnecessary foldersPerl Archive::Zip 创建不必要的文件夹
【发布时间】: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 时,我看到它包含子文件夹,即 WindowsPerl,后者实际上包含 test1test2test3。出于某种原因,文件夹本身正在被压缩。

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

【问题讨论】:

    标签: perl zip archive directory


    【解决方案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 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"
    

    【讨论】:

    • 非常酷...但是我的 $member = basename $file 行出现错误。编译器正在寻找有效的路径名
    • 如果您收到错误,您应该发布它们以便我们查看。
    • 如果您不告诉我错误是什么,以及您正在使用的$file 的值是什么,我无法帮助您。
    猜你喜欢
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    相关资源
    最近更新 更多