Как я могу создать путь со всеми его подкаталогами в одном кадре в Perl? - PullRequest
8 голосов
/ 25 августа 2009

Если у вас есть путь к файлу (например, /home/bob/test/foo.txt), где каждый подкаталог в пути может существовать или не существовать, как я могу таким образом создать файл foo.txt который использует "/home/bob/test/foo.txt" в качестве единственного ввода вместо того, чтобы создавать каждый несуществующий каталог в пути один за другим и, наконец, сам создавать foo.txt?

Ответы [ 3 ]

24 голосов
/ 25 августа 2009

Вы можете использовать Файл :: Базовое имя и Файл :: Путь

 use strict;
 use File::Basename;
 use File::Path qw/make_path/;

 my $file = "/home/bob/test/foo.txt";
 my $dir = dirname($file);
 make_path($dir);
 open my $fh, '>', $file or die "Ouch: $!\n"; # now go do stuff w/file

Я не добавил никаких тестов, чтобы увидеть, существует ли файл, но это довольно легко добавить с помощью Perl.

3 голосов
/ 25 августа 2009

Использовать make_dir из File :: Util

   use File::Util;
   my($f) = File::Util->new();
   $f->make_dir('/var/tmp/tempfiles/foo/bar/');

   # optionally specify a creation bitmask to be used in directory creations
   $f->make_dir('/var/tmp/tempfiles/foo/bar/',0755);
2 голосов
/ 25 августа 2009

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

Но mkpath () из модуля File :: Path может почти сделать это, учитывая каталог имени файла. Из документа File :: Path:

Функция "mkpath" обеспечивает удобный способ создания каталогов, даже если ваш вызов ядра "mkdir" не будет создать более одного уровня каталог за раз.

Обратите внимание, что mkpath () не сообщает об ошибках в хорошем смысле: по какой-то причине он умирает, а не просто возвращает ноль.

Учитывая все это, вы можете сделать что-то вроде:

use File::Basename;
use File::Path;

my $fname = "/home/bob/test/foo.txt";

eval {
    local $SIG{'__DIE__'};  # ignore user-defined die handlers
    mkpath(dirname($fname));
};
my $fh;
if ($@) {
    print STDERR "Error creating dir: $@";
} elsif (!open($fh, ">", $fname)) {
    print STDERR "Error creating file: $!\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...