Все задачи

Созидательный труд-3

17 Sep 2013

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

Подсказка

Показать

Всякий каталог – это файл, но не всякий файл – это каталог.

Подсказка-2

Показать

Оператор -e проверяет существование указанного файла.

Разоблачение

Показать

Оператор -e проверяет существование файла, причем не обязательно каталога.

Если в файловой системе существует обыкновенный файл (не каталог), совпадающий по имени с каталогом, который должна создать функция mkdir_recursive, то последняя не умирает, хотя нужный каталог и не был создан (да и не может быть создан). Стоит отслеживать такие случаи непосредственно в функции создания каталогов.