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 时,我看到它包含子文件夹,即 WindowsPerl,后者实际上包含 test1test2test3。出于某种原因,文件夹本身正在被压缩。

我怎样才能使只有文件被压缩,而不必单击 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 对象

Perl Archive::zip -- 文件没有被添加

使用 Perl 从 zip 中获取目录结构 [关闭]

使用 Archive::Zip 存储文件时遇到问题:我得到没有错误代码的空 zip 文件

Python - 多进程池中的 make_archive zip 无法正常工作