“ if(-f $ file_path1){”始终为true,无论文件是否存在

时间:2018-08-28 09:12:30

标签: perl mojolicious

在我的Mojolicious应用中,我有这个:

if (-f $file_path1) {
    app->log->debug("file1 exists: $file_path1");
    # ...........

} else {
    app->log->debug("file1 doesn't exist: $file_path1; creating....\r\n");

无论其存在与否,它都不会打印“ file1不存在”

当我删除它时,它仍然不会打印出来,因为它不存在。

怎么可能?

1 个答案:

答案 0 :(得分:1)

首先,要检查文件是否存在,您需要-estat(而不是-f)。

第二,将“存在但不是普通文件”结果,“未找到文件”错误和其他错误视为“未找到文件”错误。如果事情没有按预期运行,则应更仔细地检查实际上返回了什么错误!

if (-e $file_path1) {
   app->log->debug("\"$file_path1\" already exists.\n");
}
elsif ($!{ENOENT}) {
   app->log->debug("\"$file_path1\" doesn't exist. Creating...\n");
}
else {
   app->log->debug("Error stating \"$file_path1\": $!\n");
}

if (stat($file_path1)) {
   app->log->debug("\"$file_path1\" already exists.\n");
}
elsif ($!{ENOENT}) {
   app->log->debug("\"$file_path1\" doesn't exist. Creating...\n");
}
else {
   app->log->debug("Error stating \"$file_path1\": $!\n");
}

如果您因为还想检查它是否为纯文件而使用-f,则可以使用以下命令:

my $rv = -f $file_path1;
if (defined($rv)) {
   if ($rv) {
      app->log->debug("\"$file_path1\" already exists.\n");
   } else {
      app->log->debug("\"$file_path1\" already exists, but isn't a plain file.\n");
   }
} else {
   if ($!{ENOENT}) {
      app->log->debug("\"$file_path1\" doesn't exist. Creating...\n");
   } else {
      app->log->debug("Error stating \"$file_path1\": $!\n");
   }
}

if (stat($file_path1)) {
   if (-f _) {
      app->log->debug("\"$file_path1\" already exists.\n");
   } else {
      app->log->debug("\"$file_path1\" already exists, but isn't a plain file.\n");
   }
} else {
   if ($!{ENOENT}) {
      app->log->debug("\"$file_path1\" doesn't exist. Creating...\n");
   } else {
      app->log->debug("Error stating \"$file_path1\": $!\n");
   }
}

假设您是对的,并且问题实际上不是文件不存在,那么这些片段中的任何一个都将成为无法stat编辑文件的原因。可能是权限问题?

如果我的代码片段告诉您该文件不存在,那么实际上就不存在。确保您要传递给stat / -e / -f的值包含您认为的值(例如,没有尾随空格,CR或LF)。如果该路径是相对路径,也可能是您对当前工作目录做出了错误的假设。