1

リモート ファイルをローカルの zip アーカイブに追加しようとしています。現在、私はこのようなことをしています。

use Modern::Perl;
use Archive::Zip;
use File::Remote;

my $remote = File::Remote->new(rsh => "/usr/bin/ssh", rcp => "/usr/bin/scp");
my $zip = Archive::Zip->new();

$remote->open(*FH,'host2:/file/to/add.txt');
my $fh = IO::File->new_from_fd(*FH,'r');

#this is what I want to do.
$zip->addFileHandle($fh,'add.txt');

...

残念ながら、Archive::Zip には addFileHandle メソッドがありません。

私がそれを行うことができる別の方法はありますか?

ありがとう。

4

2 に答える 2

2

次のようにします (ローカル パスにコピーします)。

$remote->copy("host:/remote/file", "/local/file");

Archive::Zip によって提供される addFile メソッドをローカル ファイルで使用します。

于 2013-01-30T21:55:43.693 に答える
1

Archive::Zip は zip ファイルへの書き込みのファイルハンドルをサポートしていないかもしれませんが、Archive::Zip::SimpleZip はサポートしています。

これは、一時ファイルを必要とせずに、ファイルハンドルから読み取り、zip ファイルに直接書き込む方法を示す自己完結型の例です。

use warnings;
use strict;

use Archive::Zip::SimpleZip;
use File::Remote;

# create a file to add to the zip archive
system "echo hello world >/tmp/hello" ;

my $remote = File::Remote->new(rsh => "/usr/bin/ssh", rcp => "/usr/bin/scp");
my $zip = Archive::Zip::SimpleZip->new("/tmp/r.zip");

$remote->open(*FH,'/tmp/hello');

# Create a filehandle to write to the zip fiule.
my $member = $zip->openMember(Name => 'add.txt');

my $buffer;
while (read(FH, $buffer, 1024*16))
{
    print $member $buffer ;
}

$member->close();
$zip->close();

# dump the contents of the zipo file to stdout
system "unzip -p /tmp/r.zip" ;    
于 2013-01-31T23:06:36.393 に答える