我正在尝试将远程文件添加到本地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方法。
我还能采用其他方式吗?
感谢。
答案 0 :(得分:2)
做这样的事情(复制到本地路径):
$remote->copy("host:/remote/file", "/local/file");
并使用Archive :: Zip提供的addFile方法和本地文件
答案 1 :(得分: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" ;