2014-09-15 3 views
2

Я использую mkpath для создания каталога.mkpath Файл :: Путь не работает должным образом

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

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

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

+0

Мне все равно. Я просто хочу, чтобы ошибка была quiesced для уже существующей директории.Я понимаю, что я всегда могу кодировать вокруг него, но если есть еще одна функция или метод, которые уже имеют это ... – Paul

ответ

3

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

mkpath('/home/myhome'); 

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

eval { mkpath('/home/myhome'); 1 } 
    or die "Can't create home directory: [email protected]\n"; 

Обратите внимание на использование [email protected], не $!.

1

doc говорит:

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

, как ikdegami указывал на следующей обработке ошибок не будет работа

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

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

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

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

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

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

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

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

из дока:

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

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

+0

Мне нравится, если только над моим if. – Paul

+0

@ikegami узнал и исправил ... – jm666

+0

@Paul исправил мой ответ. – jm666

Смежные вопросы