«if (-f $ file_path1) {» всегда верно независимо от того, существует файл или нет - PullRequest
0 голосов
/ 28 августа 2018

В моем приложении 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");

Независимо от своего присутствия, он никогда не печатает "файл1 не существует"

Когда я его удаляю, он все равно не печатает, что его не существует.

Как это может быть?

1 Ответ

0 голосов
/ 28 августа 2018

Прежде всего, чтобы проверить, существует ли файл, вы хотите -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). Если путь является относительным, это также может означать, что вы делаете неправильные предположения о текущем рабочем каталоге.

...