我编写了以下代码以连接到ftp位置并将一个文件下载到本地文件系统中。
Themes/generic.xaml
根本没有问题,它是在我的LFS上下载并存储一个文件。但是我有多个文件要下载。因此,我在#!/usr/local/bin/perl -w
use strict;
use Net::FTP;
my $hostname = 'mirror.anl.gov';
my $username = 'anonymous';
my $password = 'username@domain.com';
# Hardcode the directory and filename to get
my $home = '/pub';
my $filename = 'motd';
# Hardcode the local directory
my $localdir = '/home/boy/';
# Open the connection to the host
my $ftp = Net::FTP->new($hostname)
or die "Cannot connect to $hostname: $@"; # Construct object
$ftp->login($username, $password)
or die "Cannot login ", $ftp->message;; # Log in
$ftp->cwd($home)
or die "Cannot change working directory ", $ftp->message;# Change
+directory
my @filelist=$ftp->ls($home);
print map { "$_\n"} @filelist;
# Now get the file and leave
$ftp->get($filename,$localdir.$filename)
or die "Cannot get $filename: $@";
$ftp->quit;
上使用了foreach
循环,如下所示:
@filelist
但是现在我在最后一个foreach(@filelist){
print map { "$_\n"} @filelist;
# Now get the file and leave
$ftp->get($filename,$localdir.$filename)
or die "Cannot get $filename: $@";
}
上遇到了错误。由于必须获取多个文件,因此现在我从代码中删除了die
,现在$filename
循环如下所示:
foreach
但是我又遇到了同样的错误。现在我知道,foreach(@filelist){
print map { "$_\n"} @filelist;
# Now get the file and leave
$ftp->get($localdir)
or die "Cannot get $filename: $@";
}
函数在我们仅需要下载单个文件时使用,get
在我们需要下载多个文件时使用。但是当我使用̀mget`时,出现以下错误:
mget
那我们如何完成任务呢?
答案 0 :(得分:3)
您遍历了文件列表,但是没有使用迭代器(即列表中的每个元素)。
for my $filename (@filelist) {
$ftp->get($filename, "$localdir/$filename")
or die "...";
}
答案 1 :(得分:1)
现在我知道,
get
函数仅在需要下载单个文件时使用,mget
是在我们需要下载多个文件时使用
mget
是某些FTP客户端(IBM,Microsoft等)中可用的命令,但在RFC 959(FTP规范)中不存在。 Net::FTP
模块也不提供此功能。必须使用NLST
(名称列表)和GET
命令来实现,如果需要,还可以使用内部glob
过滤器的补充。
请注意,RFC说明了NLST
该命令旨在 返回程序可以使用的信息 自动进一步处理文件。例如,在 实现“多次获取”功能。