Другое неясное обходное решение к этой проблеме является тем, определенным во временном файле 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), чем любая из других двух альтернатив, исследуемых до сих пор.
Вы можете использовать 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.
Я не думаю, что есть стандартная функция, которая может делать все, что вы просите, прямо из имени файла.
Но 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";
}
Используйте 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);