如何仅压缩文件而不压缩完整路径

How to zip only files and not the full path

我正在尝试使用 Archive::Zip 压缩图像文件。文件位于 Data/Temp/Files 当我循环浏览目录中的日志并将它们添加到 zip 文件时,当我只想要图像文件时,我最终得到了文件夹层次结构和图像文件。

所以 zip 最终包含:

Data
  └Temp  
    └Files
       └Image1.jpg
        Image2.jpg
        Image3.jpg

当我希望 zip 文件包含时:

Image1.jpg
Image2.jpg
Image3.jpg

这是我正在 运行 测试的脚本:

#!/usr/bin/perl
use Archive::Zip;

$obj = Archive::Zip->new();   # new instance

@files = <Data/Temp/Files/*>;

foreach $file (@files) {
    $obj->addFile($file);   # add files
}

$obj->writeToFileNamed("Data/Temp/Files/Images.zip");

使用chdir进入目录:

use Archive::Zip;

$obj = Archive::Zip->new();   # new instance

chdir 'Data/Temp/Files';
@files = <*>;

foreach $file (@files) {
    $obj->addFile($file);   # add files
}

$obj->writeToFileNamed("Images.zip");

zip 存档成员的名称和路径完全独立于它们对应的真实文件。虽然这两个名称通常是相同的,但 AddFile 允许您指定第二个参数,即文件信息应存储的相应存档成员的名称和路径

您可以使用 File::Basename 模块中的 basename 从完整路径中仅提取文件名来达到您要求的效果

本程序演示。请注意,在您编写的每个 Perl 程序的顶部 essentialuse strictuse warnings

use strict;
use warnings;

use Archive::Zip;
use File::Basename 'basename';

my $zip = Archive::Zip->new;

for my $jpg ( glob 'Data/Temp/Files/*.jpg' ) {
  $zip->addFile($jpg, basename($jpg));
}

$zip->writeToFileNamed('Data/Temp/Files/Images.zip');