我正在尝试读取文件内容并将其分配给变量。将变量传递给FTP,以便它可以ftp文件。输入包含多行。因此我正在使用while循环。
当我在UNIX环境中执行ode时,它说
"Cannot open Local file <file name> : No such file or directory
但是我能够在该位置看到该文件。
输入文件内容(cfilelistftpA):
sxa1:OUT047
axk1:OUT635
...
以下是UNIX上ls
的输出axk1: ls -lrt
total 596
-rw-rw-rw- 1 axk1 ptuser 599399 Jul 23 23:06 OUT635
sxa1@axk5hbz: pwd
/home/sxa1/udms/axk1
sxa1: ls -lrt
total 836
-rw-rw-rw- 1 sxa1 ptuser 844664 Jul 23 23:06 OUT047
sxa1: pwd
/home/sxa1/udms/sxa1
我无法弄清楚这个问题。 非常感谢任何帮助。
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Std;
use File::Copy;
use File::Path;
use Net::FTP;
# declare and initialize counter
my $lfile = "LogFile";
my $filelistftpA = "/home/sxa1/filelistFTPA";
my $cfilelistftpA = "cfilelistftpA";
my $newPath = "/home/sxa1/udms";
my $newUDrive = "X:\\udms";
my $host1 = "XXXX";
my $user1 = "XXXX";
my $password1 = "XXXXX";
my ( $drive1, $part4 ) = split /:/, $newUDrive;
open (LOGFILE, "> $lfile") or die "Could not open log file $!\n";
my $ftpfiles = Net::FTP->new($host1) or die "Can't open $host1\n";
$ftpfiles->login($user1, $password1) or die "can't log $user1 \n";
$ftpfiles->binary();
open (MYFILESA, "< $cfilelistftpA");
while (<MYFILESA>)
{
chomp;
my $fileline = $_;
my ($dirnameisA,$filenameisA) = split /:/, $fileline;
print LOGFILE "Dir name is: $dirnameisA\n";
print LOGFILE "File name is: $filenameisA\n";
print LOGFILE "$hour, $min\n";
# $ftpfiles->cwd($part4);
# $ftpfiles->cwd($dirnameisA);
my $dstFilesA = "$newPath/$dirnameisA/$filenameisA";
if (-e "$dstFilesA")
{
print LOGFILE "File Exists: $dstFilesA \n";
}
else
{
print LOGFILE "File does not Exists: $dstFilesA \n";
}
$ftpfiles->cwd($part4);
$ftpfiles->cwd($dirnameisA);
$ftpfiles->put("$dstFilesA");
print LOGFILE "READING from FILE: $_\n";
}
$ftpfiles->quit();
close (MYFILESA);
close(LOGFILE);
Output by executing "perl testftp.pl"
Cannot open Local file /home/sxa1/udms/sxa1/OUT047 : No such file or directory
at testftp.pl line 62
Cannot open Local file /home/sxa1/udms/axk1/OUT635 : No such file or directory
at testftp.pl line 62
logfile contents:
Dir name is: sxa1
File name is: OUT047
File does not Exists: /home/sxa1/udms/sxa1/OUT047
READING from FILE: sxa1:OUT047
Dir name is: axk1
File name is: OUT635
File does not Exists: /home/sxa1/udms/axk1/OUT635
READING from FILE: axk1:OUT635
答案 0 :(得分:0)
您的代码正在寻找以下文件:
my $newPath = "/home/san/udms";
您的ls
个商家信息和pwd
命令正在寻找以下文件:
/home/sxa1/udms/axk1
如果你的拼写一致,你就有更多的机会工作;如果你把它们弄清楚,它会提高它的工作机会。
答案 1 :(得分:0)
当您执行Net::FTP
时,您收到的错误无法打开本地文件来自put
。当sysopen
无法打开您已通过的文件名时,会发生这种情况。它通常表明该文件不存在。
转到该错误消息并复制该文件名。整个名称包括目录。现在,将其粘贴到ls
命令中:
$ ls /home/sxa1/udms/sxa1/OUT047
No such file or directory
如果您收到该错误,那么您尝试put
的文件名是错误的。看看它,看看你是否能搞清楚。例如,我在路径中看到sxa1
两次。这是对的吗?
如果文件确实存在,请查看其他可能的问题:
Net::FTP->put
命令可能会列出文件,但您没有看到实际名称。 如果您仍然无法解决问题,请将更多日志记录信息添加到您的程序中。改变这些行:
$ftpfiles->cwd($part4);
$ftpfiles->cwd($dirnameisA);
$ftpfiles->put("$dstFilesA");
要:
print qq(Changing to directory "$part4"\n);
$ftpfiles->cwd($part4) or warn qq(Can't change to directory "$part4");
print qq(Changing to directory "$dirnameisA"\n);
$ftpfiles->cwd($dirnameisA) or warn qq(Can't change to directory "$dirnameisA");
print qq(Attempting to "put" file "$dstFilesA"\n);
$ftpfiles->put("$dstFilesA") or warn qq(Can't put file "$dstFilesA");
我正在查看这些行的返回状态,看看我是否可以找出可能出错的地方。我在文件名周围加上引号。也许该文件具有前导或结束空格或者可能是回车符。也许是一个隐藏的Windows NL,因为创建此文件的人在Windows上这样做了,而你在Unix上执行它。
了解这会给你带来什么。
另外,你声称这是程序,但它只有57行。 Net::FTP
声称此错误在您的计划的第62行。你能告诉我们哪一行给你这个错误吗?我假设put
正在这样做,但那只是#51行。