Программист еще раз исправил модуль MkDir из предыдущей задачи, и стал вызывать mkdir только если каталог еще не существует.
MkDir3.pm (файл скачивается):
package MkDir3;
use strict;
use warnings;
=head1 NAME
MkDir3 -- рекурсивное создание каталогов
=head1 SYNOPSIS
use MkDir3;
MkDir3::mkdir_recursive("test/a");
MkDir3::mkdir_recursive("/tmp/test/b");
=head1 DESCRIPTION
Модуль предоставляет функцию mkdir_recursive для рекурсивного создания каталогов.
Модуль предназначен для Unix-подобных систем с разделителем в именах каталогов "/" и корневым каталогом /.
=cut
sub _mkdir
{
my ($dir) = @_;
unless (-e $dir){
mkdir $dir or die "can't create dir $dir: $!";
}
}
sub mkdir_recursive
{
my $path = shift or die;
my @parts = split "/", $path;
my $dir = shift @parts;
_mkdir $dir unless $dir eq '';
for my $d (@parts){
$dir .= "/$d";
_mkdir $dir;
}
}
1;
Еще можно скачать пример использования.
Однако и здесь не все хорошо.
Иногда mkdir_recursive
отрабатывает
без ошибок, но затем не получается
записать файл в свежесозданном каталоге.
Всякий каталог – это файл, но не всякий файл – это каталог.
Оператор -e
проверяет существование указанного файла.
Оператор -e
проверяет существование
файла, причем не обязательно каталога.
Если в файловой системе существует
обыкновенный файл (не каталог), совпадающий
по имени с каталогом, который должна создать функция
mkdir_recursive
,
то последняя не умирает, хотя нужный каталог
и не был создан (да и не может быть создан).
Стоит отслеживать такие случаи непосредственно
в функции создания каталогов.