Perl - Net::SFTP::Foreign



我正在尝试用Perl编写一个上传脚本,使用Net::SFTP::Foreign。

我在检查目录是否存在时遇到问题,如果不存在,请创建它。

Net::SFTP::Foreign 似乎只是错误并关闭连接,如果目录不存在,并且从不运行"else">

你可以看到下面的代码,任何人都可以看到我哪里出了问题吗?

sub uploadtoftp
{
use Net::SFTP::Foreign;
use File::Basename;
use warnings;
my $host=$_[0];
my $user=$_[1];
my $pw=$_[2];

my $home_directory ="/home/testuser";
my $remote_path=$home_directory."/".$name."/".$destination_dir;

if (my $ftp = Net::SFTP::Foreign->new($host,
user => $user,
password => $pw,
autodie => 0))
{
my $destination_dir_proceed=0;

$ftp->find("$remote_path", on_error => sub { print "Creating directoryn"; $ftp->mkdir("$remote_path")  });
print $ftp->error;

if($ftp->opendir($remote_path)) 
{
$destination_dir_proceed=1;
}

if($destination_dir_proceed==1) 
{
# --- loop through file list and upload all new files
foreach $filename (split(/ /, $file_list)) 
{
$ftp->put($filename,$remote_path.$filename);
}

}
else
{
print "cannot reach directory $remote_pathn";
}

}


} # end subroutine uploadtoftp()

当您实例化 Net::SFTP::Foreign 对象时,您使用autodie => 1创建了它。

Autodie将"自动将无法恢复的错误提升为可执行文件"。

您可以删除自动模具行并正常,只要您在整个脚本中定期检查状态即可。

如果有你想死的地方,你可以在提出请求后使用die_on_error

可以使用以下逻辑创建文件夹:

$ftp->find("$remote_path", on_error => sub { print "Creating directoryn"; $ftp->mkdir("$remote_path") });

如果您不需要打印语句:

$ftp->find("$remote_path", on_error => sub { $ftp->mkdir("$remote_path") });

如果您需要在路径中创建所有丢失的文件夹,这应该可以工作(我目前无法测试它,但这个想法似乎是正确的(。

my $home_directory ="home/testuser";
my $remote_path=$home_directory."/".$name."/".$destination_dir;
my $currentPath = '';
foreach my $directory (split '/', $remote_path) {
$currentPath = "$currentPath/$directory";
$ftp->find("$currentPath", on_error => sub { print "Creating directoryn"; $ftp->mkdir("$currentPath") });
}

最新更新