【问题标题】:"if (-f $file_path1) {" is always true regardless whether or not a file exists“if (-f $file_path1) {” 始终为真,无论文件是否存在
【发布时间】:2018-08-28 09:12:29
【问题描述】:

在我的 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 不存在”

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

这怎么可能?

【问题讨论】:

    标签: perl mojolicious


    【解决方案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");
       }
    }
    

    假设你是对的,问题不是文件不存在,这些 sn-ps 中的任何一个都会得到文件不能为stated 的原因。可能是权限问题?

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

    【讨论】:

    • 为什么不-f ?.
    • @Rattiku -f 拒绝符号链接。
    • 因为它不只是检查是否存在,它还检查它是否是一个普通文件
    • 这就是我想要的:-f
    • 这不是你的问题所说的。它说您正在检查文件是否存在。如果您解决问题,我会解决答案,但答案无论如何都涵盖了
    猜你喜欢
    • 2021-10-04
    • 2015-05-31
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 2012-08-18
    • 2018-06-19
    • 1970-01-01
    相关资源
    最近更新 更多