在我的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不存在”
当我删除它时,它仍然不会打印出来,因为它不存在。
怎么可能?
答案 0 :(得分:1)
首先,要检查文件是否存在,您需要-e
或stat
(而不是-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)。如果该路径是相对路径,也可能是您对当前工作目录做出了错误的假设。