使用带有IO :: Compress :: Zip的Perl将文件压缩而不将其目录复制到存档中

时间:2014-08-06 15:06:39

标签: perl zip

我被分配了更改一些创建 zip 存档的Perl代码以使其与 zip64 兼容的任务,以便它可以创建超过4 GB的存档或拥有超过64K的会员。

旧代码使用Archive::Zip模块,该模块仅限于zip,不包含zip64扩展名。所以现在我正在使用支持zip64的IO::Compress::Zip模块。

我正在尝试压缩桌面上的两个文件并将新存档放在桌面上 一切都运行正常,但文件没有放在我的存档的根目录中,它们的整个目录都是在存档中创建的。

例如,我的桌面上有两个文件:file1file2,我使用以下代码

use strict;
use warnings;

use IO::Compress::Zip qw(zip $ZipError) ; 

my $file = $ENV{"HOME"}."/Desktop/file1";
my $file2 = $ENV{"HOME"}."/Desktop/file2";

my $s = zip [ $file1, $file2 ] => $ENV{"HOME"}."/Desktop/new_.zip" , zip64 => 1 
        or die "zip failed: $ZipError \n";

当我去检查我的档案时,我找到以下目录

"home"-> "mohamad" -> "Desktop"

并在此目录中找到我的文件。

如何将文件直接复制到存档的根目录?

2 个答案:

答案 0 :(得分:1)

我不是IO::Compress::Zip的专家,但如果它像其他压缩实用程序/库一样,则需要cd到$ENV{"HOME"}."/Desktop/然后仅压缩["file1", "file2"]

答案 1 :(得分:1)

Archive::Zip类似,IO::Compress::Zip将包含您要归档的文件中指定的目录。不要在任何地方使用$ENV{"HOME"}."/Desktop/,而应该只是

chdir "$ENV{HOME}/Desktop"

然后指定要保存的裸文件名。它解决了您的问题,并使代码更加整洁。

看起来像这样。请注意,我已使用autodie来避免必须明确检查chdir是否已成功。另外,在我的Windows 7系统上,正确的环境变量是USERPROFILE,但我想你正在运行XP或其他一些变种。

use strict;
use warnings;
use autodie;

use IO::Compress::Zip qw(zip $ZipError);

chdir "$ENV{HOME}/Desktop";

my $file1 =  'file1';
my $file2 =  'file2';

my $s = zip [ $file1, $file2 ] => 'new_.zip', Zip64 => 1 
        or die "Zip failed: $ZipError\n";

<强>更新

作为替代方法,您可以使用FilterName回调来修改存储在zip文件中的名称。完全删除路径很简单,看起来像这样。

use strict;
use warnings;

use IO::Compress::Zip qw(zip $ZipError);

my $file1 =  "$ENV{HOME}/Desktop/file1";
my $file2 =  "$ENV{HOME}/Desktop/file2";

my $s = zip [ $file1, $file2 ] => "$ENV{USERPROFILE}/Desktop/new_.zip",
    FilterName => sub { s<.*[/\\]><> },
    Zip64 => 1,
        or die "Zip failed: $ZipError\n";