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

"if (-f $file_path1) {" is always true regardless whether or not a file exists

在我的 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 doesn't exist"

当我删除它时,它仍然不打印它不存在。

怎么会这样?

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

其次,您将 "exists but isn't a plain file" 结果、"file not found" 错误和其他错误视为 "file not found" 错误。如果事情没有像您预期的那样工作,您应该更仔细地检查实际返回的错误是什么!

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");
   }
}

假设您是对的,并且问题不在于文件不存在,那么这些片段中的任何一个都会得到文件无法 stated 的原因。也许是权限问题?

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