无法打开本地文件/ dir1 / file1:没有这样的文件或目录:PERL代码

时间:2014-07-24 05:12:18

标签: perl

我正在尝试读取文件内容并将其分配给变量。将变量传递给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

2 个答案:

答案 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行。