2009-03-31 3 views
9

В настоящее время мой Perl выход жестко сваливать в следующий каталог UNIX:Как создать каталог, если он не существует с помощью Perl?

my $stat_dir = "/home/courses/".**NEED DIR VAR HERE**; 

Имя файла строится как таковой:

$stat_file = $stat_dir . "/".$sess.substr($yr, 2, 2)."_COURSES.csv"; 

мне нужен подобный подход к построению UNIX каталогов, но нужно проверить, существуют ли они прежде, чем создавать их.

BONUS EXTRA CREDIT WIN:
Автоматическая нумерация $ stat_file, так что, когда эти файлы загружаются в один и тот же каталог, они не перезаписывают или не добавляют к существующим файлам в каталоге. (Я не знаю, был ли этот вопрос еще поставлен на S.O. - извините, если его повторный пост)

ответ

13

Используйте оператора -d и File::Path.

use File::Path qw(make_path); 
eval { make_path($dir) }; 
if ([email protected]) { 
    print "Couldn't create $dir: [email protected]"; 
} 

make_path имеет преимущество перед mkdir в том, что она может создавать деревья произвольной глубины.

И использовать -e проверить файл существует

my $fileSuffix = 0; 
while (-e $filename) { 
    $filename = $filePrefix . ++$fileSuffix . $fileExtension; 
} 
+1

Проверка наличия на складе $ @ недостоверна. Использовать eval {mkpath ($ dir); 1} или {warn "badness \ n"}. См. Http://search.cpan.org/dist/Acme-ExceptionEater/lib/Acme/ExceptionEater.pm для примера того, почему проверка $ @ является плохим. – daotoad

+0

Начиная с версии v2.09 (2013-01), похоже, что теперь делается make_path – kyle

15

Эмм ... mkdir $stat_dir unless -d $stat_dir?

На самом деле не очень хорошая идея вставлять такие «лишние» вопросы.

+0

Я вроде согласен, но решил, что они являются хорошим пакетом, чтобы знать, когда пытаетесь делать подобные вещи. – CheeseConQueso

+0

Derp. Мне не пришлось бы это делать. – primo

2

Perl имеет встроенную функцию mkdir

Взгляните на perldoc perlfunc или программы MKDIR из Perl Power Tools.

Я считаю, что безопасно создать каталог, который уже существует, взгляните на документы.

3

Помните, что существование -d в каталоге не означает -w для записи. Но при условии, что вы находитесь в личной зоне, mkdir($dir) unless(-d $dir) будет работать нормально.