Perl sFTP:如何检查远程文件不存在

时间:2015-07-28 07:58:43

标签: perl sftp

我到Perl已经1天了,正在经历API doc here,几乎没有基本问题

  $sftp = Net::SFTP::Foreign->new($host, autodie => 1);
  my $ls = $sftp->ls("/bar");
  # dies as: "Couldn't open remote dir '/bar': No such file"

问题

  • 使用autodie会自动关闭连接吗?
  • 我们在上面的示例中看到如何使用文件夹,类似的语法也适用于文件?

或者这样的事情更有意义吗?

  my $sftp = Net::SFTP::Foreign->new($host, autodie => 1);
  $sftp->find("/sdfjkalshfl", # nonexistent directory
              on_error => sub { print "foo!\n";sftp->disconnect();exit; });

我试图在我的Windows机器上运行以下代码

use Net::SFTP::Foreign;
my $host = "demo.wftpserver.com";
my $sftp = Net::SFTP::Foreign->new($host ,ssh_cmd => 'plink',autodie => 1);
my $ls = $sftp->ls("/bar");

但我得到错误

  

' PLINK'不被视为内部或外部命令,

然而,当我从Windows命令行运行plink时,它工作正常!!

1 个答案:

答案 0 :(得分:2)

  

使用autodie会自动关闭连接吗?

是。当程序结束时,所有内容都会被销毁,连接也会关闭。当$sftp变量超出范围时也是如此。像这样的模块通常实现a DESTROY sub。当对象(它只是Perl中的引用)超出范围时,会调用它们。该子可以有一些清理。另一个例子是DBI,当然还有词法文件句柄(例如来自$fh调用的open)。

  

我们在上面的示例中看到如何使用文件夹,类似的语法也适用于文件?

不。 The docsls用于目录:

  

获取远程目录$ remote的列表。如果未给出$ remote,则列出当前的远程工作目录。

但是你可以为你想要的文件所在的目录做ls,并使用wanted选项。

my $ls = $sftp->ls( '/home/foo', wanted => qr/^filename.txt$/ );

虽然autodie会死亡,但如果你不想让它真的死在这里,你应该把它包裹在Try::Tiny电话或eval中。

use Try::Tiny

# ...

my $ls = try { 
  return $sftp->ls( '/home/foo', wanted => qr/^filename.txt$/ );
} catch {
  return; # will return undef
};

say 'Found file "filename.txt" on remote server' if $ls;

至于plink未找到,可能Windows PATH与Perl看到的不同。