"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"
当我删除它时,它仍然不打印它不存在。
怎么会这样?
首先,要检查文件是否存在,您需要 -e
或 stat
(而不是 -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");
}
}
假设您是对的,并且问题不在于文件不存在,那么这些片段中的任何一个都会得到文件无法 stat
ed 的原因。也许是权限问题?
如果我的代码片段告诉您该文件不存在,那么它确实不存在。确保您传递给 stat
/-e
/-f
的值包含您认为的内容(例如没有尾随空格、CR 或 LF)。如果路径是相对路径,也可能是您对当前工作目录的假设不正确。
在我的 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"
当我删除它时,它仍然不打印它不存在。
怎么会这样?
首先,要检查文件是否存在,您需要 -e
或 stat
(而不是 -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");
}
}
假设您是对的,并且问题不在于文件不存在,那么这些片段中的任何一个都会得到文件无法 stat
ed 的原因。也许是权限问题?
如果我的代码片段告诉您该文件不存在,那么它确实不存在。确保您传递给 stat
/-e
/-f
的值包含您认为的内容(例如没有尾随空格、CR 或 LF)。如果路径是相对路径,也可能是您对当前工作目录的假设不正确。