Perl: открыть файл, но не перезаписать существующий, а добавить номер - PullRequest
1 голос
/ 04 марта 2011

Интересно, существует ли какой-либо модуль, способный автоматизировать процесс нумерации файлов?Если я пытаюсь открыть "foo.bar", и он существует, я открываю "foo_1.bar" без условия гонки.Что если два приложения попробуют открыть какой-нибудь файл.Открыть не удалось или они получают файловые дескрипторы с другим номером?Большое спасибо за помощь.

Ответы [ 3 ]

3 голосов
/ 04 марта 2011

Я не знаю ни одного стандартного модуля, который бы делал это на макушке, но основная идея, если вам нужно последовательное имя файла:

use Fcntl;
use Errno;

$seq = "";
until (defined ($fh = sysopen("foo".$seq.".bar", O_WRONLY|O_CREAT|O_EXCL, 0600))) {
  last if $! != EEXIST;
  $seq eq '' && $seq = '_0';
  $seq =~ s/(\d+)/$1 + 1/e;
}
# if !defined $fh then $! contains the error, otherwise "foo".$seq.".bar" is created
1 голос
/ 04 марта 2011

Открывает уникальное имя файла для записи. Вернуть массив ref в IO :: File ref и записать имя. Если не получится, верните undef. Работа с предупреждениями и строгими.

use Fcntl;
use Errno;
use IO::File;

sub open_unique {

    my $file = shift || '';
    unless ($file =~ /^(.*?)(\.[^\.]+)$/) {
        print "Bad file name: '$file'\n";
        return;
    }
    my $io;
    my $seq  = '';
    my $base = $1;
    my $ext  = $2;
    until (defined ($io = IO::File->new($base.$seq.$ext
                                   ,O_WRONLY|O_CREAT|O_EXCL))) {

        last unless $!{EEXIST};
        $seq = '_0' if $seq eq '';
        $seq =~ s/(\d+)/$1 + 1/e;
    }

    return [$io,$base.$seq.$ext] if defined $io;

}
0 голосов
/ 04 марта 2011

Возможно, вы захотите посмотреть File :: Temp .

Что-то вроде:

($fh, $filename) = tempfile('foo_XXXX', SUFFIX => '.bar');
print $fh "Some data\n";
close($fh) or die;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...