Прежде всего, чтобы проверить, существует ли файл, вы хотите -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
ed. Возможно, проблема с разрешением?
Если мои фрагменты скажут вам, что файл не существует, то он действительно не существует. Убедитесь, что значение, которое вы передаете stat
/ -e
/ -f
, содержит то, что, по вашему мнению, оно делает (например, без пробелов, CR или LF). Если путь является относительным, это также может означать, что вы делаете неправильные предположения о текущем рабочем каталоге.