Мне удается загрузить файлы из подпапки ftp-сервера. Но если я хочу загрузить папки с верхнего уровня, это не работает.
Вот структура папок:
- папка rwx r-x r-x
- подпапка1 rwx r-x r-x
- file1 rw- r-- r -
- file2 rw- r-- r -
- подпапка2 rxx r-x r-x
- file3 rw- r-- r -
- file4 rw- r-- r -
Если я использую это:
$f1->cwd("/folder/subfolder1");
$f1->rget();
$f1->quit;
файлы file1 и file2 будут загружены.
Если я использую это:
$f1->cwd("/folder");
$f1->rget();
$f1->quit;
ничего не будет загружено и программа завершена из-за тайм-аута. Я ожидал, что он загрузит подпапку 1 и подпапку 2 и содержимое подпапок. Есть ли какое-то объяснение этому и как я могу решить его так, как я могу загрузить подпапку и файлы?
Подробное описание кода здесь
ОБНОВЛЕНИЕ 1: Отладка
Отладка с помощью
my $f1 = Net::FTP::Recursive->new($host1, Debug => 1) or die "Can't open $host1\n";
дает следующее:
Net::FTP::Recursive=GLOB(0x312bf50)>>> CWD /folder
Net::FTP::Recursive=GLOB(0x312bf50)<<< 250 CWD command successful
Net::FTP::Recursive=GLOB(0x312bf50)>>> PWD
Net::FTP::Recursive=GLOB(0x312bf50)<<< 257 "/folder" is the current directory
Net::FTP::Recursive=GLOB(0x312bf50)>>> PASV
Net::FTP::Recursive=GLOB(0x312bf50)<<< 227 Entering Passive Mode (188,40,220,103,255,187).
Net::FTP::Recursive=GLOB(0x312bf50)>>> LIST
Net::FTP::Recursive=GLOB(0x312bf50)<<< 150 Opening BINARY mode data connection for file list
Timeout at C:/Strawberry/perl/lib/Net/FTP.pm line 1107.
ОБНОВЛЕНИЕ 2: Тайм-аут в C: /Strawberry/perl/lib/Net/FTP.pm строка 1107.
_list_cmd
- функция строки, упомянутой в выходных данных отладки. Я также добавляю строки, где используется _list_cmd
, и обернутые строки, чтобы сделать их более читабельными, сохраняя номера строк.
671 # Try to delete the contents
672 # Get a list of all the files in the directory, excluding
# the current and parent directories
673 my @filelist = map { /^(?:\S+;)+ (.+)$/ ? ($1) : () }
grep { !/^(?:\S+;)*type=[cp]dir;/i } $ftp->_list_cmd("MLSD", $dir);
925 sub ls { shift->_list_cmd("NLST", @_); }
925 sub dir { shift->_list_cmd("LIST", @_); }
1087 sub _list_cmd {
1088 my $ftp = shift;
1089 my $cmd = uc shift;
1090
1091 delete ${*$ftp}{'net_ftp_port'};
1092 delete ${*$ftp}{'net_ftp_pasv'};
1093
1094 my $data = $ftp->_data_cmd($cmd, @_);
1095
1096 return
1097 unless (defined $data);
1098
1099 require Net::FTP::A;
1100 bless $data, "Net::FTP::A"; # Force ASCII mode
1101
1102 my $databuf = '';
1103 my $buf = '';
1104 my $blksize = ${*$ftp}{'net_ftp_blksize'};
1105
1106 while ($data->read($databuf, $blksize)) {
1107 $buf .= $databuf;
1108 }
1109
1110 my $list = [split(/\n/, $buf)];
1111
1112 $data->close();
1114 if (EBCDIC) {
1115 for (@$list) { $_ = $ftp->toebcdic($_) }
1116 }
1117
1118 wantarray
1119 ? @{$list}
1120 : $list;
1121 }