Perl - Net::SFTP:: Зарубежные
Я пытаюсь написать скрипт загрузки в 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 directory\n"; $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_path\n";
}
}
} # end subroutine uploadtoftp()
2 ответа
Когда вы создали экземпляр объекта Net::SFTP::Foreign, вы создали его с помощью autodie => 1
,
Autodie будет "автоматически переводить неустранимые ошибки в исключения".
Вы можете удалить строку autodie и быть в порядке, если вы регулярно проверяете статус в течение всего сценария.
Если есть места, где вы хотите умереть, вы можете использовать die_on_error после того, как вы сделали запрос
Вы можете использовать следующую логику для создания папки:
$ftp->find("$remote_path", on_error => sub { print "Creating directory\n"; $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 directory\n"; $ftp->mkdir("$currentPath") });
}