Как я могу создать путь со всеми его подкаталогами в одном выстреле в Perl?

Другое неясное обходное решение к этой проблеме является тем, определенным во временном файле Tuple класс в Управляемая Платформа Расширяемости (через Krzysztof KoЕєmic):

public struct TempTuple
{
    public TempTuple(TFirst first, TSecond second)
    {
        this = new TempTuple(); // Kung fu!
        this.First = first;
        this.Second = second;
    }

    public TFirst First { get; private set; }
    public TSecond Second { get; private set; }

(Полный исходный код от Codeplex: Tuple.cs)

я также отмечаю, что документация для CS0188 была обновлена для добавления:

, Если Вы видите эту ошибку при попытке инициализировать свойство в конструкторе структуры, решение состоит в том, чтобы изменить параметр конструктора для определения отступающего поля вместо самого свойства. Автореализованных свойств нужно избежать в структурах, потому что они не имеют никакого поля поддержки и поэтому не могут быть инициализированы всегда от конструктора.

, Таким образом, я беру это, чтобы означать, что официальное руководство состоит в том, чтобы использовать свойства старого стиля в Ваших структурах, когда Вы работаете в к этой проблеме, которая, вероятно, менее неясна (и больше readible), чем любая из других двух альтернатив, исследуемых до сих пор.

9
задан brian d foy 25 August 2009 в 23:18
поделиться

3 ответа

Вы можете использовать File :: Basename и File :: Path

 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.

25
ответ дан 4 December 2019 в 07:23
поделиться

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

Но 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";
}
2
ответ дан 4 December 2019 в 07:23
поделиться

Используйте 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);
3
ответ дан 4 December 2019 в 07:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: