我被分配了更改一些创建 zip 存档的Perl代码以使其与 zip64 兼容的任务,以便它可以创建超过4 GB的存档或拥有超过64K的会员。
旧代码使用Archive::Zip
模块,该模块仅限于zip,不包含zip64扩展名。所以现在我正在使用支持zip64的IO::Compress::Zip
模块。
我正在尝试压缩桌面上的两个文件并将新存档放在桌面上 一切都运行正常,但文件没有放在我的存档的根目录中,它们的整个目录都是在存档中创建的。
例如,我的桌面上有两个文件:file1
和file2
,我使用以下代码
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"
并在此目录中找到我的文件。
如何将文件直接复制到存档的根目录?
答案 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";