2

圧縮したいファイル名の次の配列があると仮定します

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、サブフォルダーが含まtest1test2ていることがわかりますtest3。何らかの理由で、フォルダー自体が圧縮されています。

ファイルのみが圧縮され、圧縮されたファイルにアクセスするためにWindows、次にPerlフォルダーをクリックする必要がないようにするにはどうすればよいですか?

4

1 に答える 1

7

addFileご覧のとおり、ディスク ファイルをアーカイブに追加するために使用する場合、Archive::Zipはファイルが元々持っていたパスと同じパスを持つアーカイブ メンバーを追加します。別のものとして保存したい場合は、作成されたアーカイブ メンバーの名前とパスとして使用される 2 番目のパラメーターを渡すことができます。

目的のために、coreFile::Basenameモジュールを使用してファイル名からパスを削除し、ベース名のみを 2 番目のパラメーターとして渡すことをお勧めします。

以下のコードはその例です。

他に注意する必要があるのは、単一のバックスラッシュを 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"
于 2013-05-13T02:52:56.113 に答える