Perl - Net :: SFTP :: Зарубежные - PullRequest
       2

Perl - Net :: SFTP :: Зарубежные

0 голосов
/ 19 сентября 2018

Я пытаюсь написать скрипт загрузки на 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 ]

0 голосов
/ 19 сентября 2018

Вы можете использовать следующую логику для создания папки:

$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") });
}
0 голосов
/ 19 сентября 2018

Когда вы создали экземпляр объекта Net :: SFTP :: Foreign, вы создали его с autodie => 1.

Autodie будет "автоматически переводить неустранимые ошибки в исключения".

Вы можете удалить строку autodie и быть в порядке, пока вы регулярно проверяете статус в течение всего сценария.

Если есть места, в которых вы хотите умереть, вы можете использовать die_on_error после того, как вы сделали запрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...