Файл mkpath :: Путь не работает должным образом

Я использую mkpath для создания каталога.

mkpath('/home/myhome') or die "Create of directory failed: $!";

Это работает, если каталог не существует, но не работает, если он существует. Из perldocs он сказал, что он похож на mkdir -p unix. Однако эта команда не сработает, если каталог уже существует.

Что я должен искать для создания каталога с несколькими путями тихо? v5.8.8

2 ответа

mkpath генерирует исключение при ошибке, поэтому вы хотите следующее:

mkpath('/home/myhome');

Если вы хотите создать собственное сообщение, вы можете использовать следующее:

eval { mkpath('/home/myhome'); 1 } or die "Can't create home directory: $@\n";

Обратите внимание на использование $@, а не $! ,


Док говорит:

Функция возвращает список каталогов, фактически созданных во время вызова; в скалярном контексте число созданных каталогов.

поскольку икдегами указал, что следующая обработка ошибок не будет работать

mkpath($path) or print "Error creating $path\n" unless -d $path;

потому что mkpath будет кричать на фатальные ошибки. (с Carp), поэтому он скорее прекратит выполнение, так как сообщение об ошибке может быть напечатано.

... если выполнение mkpath не попало в блок eval. (см. ikegami anser)

Захват с помощью eval вернет только одну ошибку. например:

eval { mkpath($p2, $p3); 1 } or die "Can't create home directory: $@\n";

если оба $p1 и $p2 терпят неудачу - не будут сообщать обо всех ошибках. Для распечатки всех ошибок вы можете использовать настраиваемую переменную для хранения диагностических сообщений, см. Раздел doc ERROR HANDLING

В этом случае mkpath не будет кричать, а в случае фатальной ошибки будет возвращено количество успешно созданных каталогов (в скалярном контексте), например:

mkpath($path1, $path2 , {error => \my $err});

из документа:

Обратите внимание: если ошибки не встречаются, $ err будет ссылаться на пустой массив. Это означает, что $ err всегда будет TRUE; поэтому вам нужно проверить @$ err, чтобы определить, произошли ли ошибки.

И вы можете распечатать их все, см. Пример в документе.

licensed under cc by-sa 3.0 with attribution.