Perl:打开文件但不覆盖现有文件但附加数字

时间:2011-03-04 01:49:51

标签: perl

我想知道是否存在可以自动化文件编号过程的任何模块。 如果我尝试打开“foo.bar”并且它存在我打开“foo_1.bar”而没有竞争条件。 如果两个应用尝试打开某个文件怎么办打开失败或他们得到不同数量的文件句柄? 非常需要帮助。

3 个答案:

答案 0 :(得分:3)

我不知道一个罐装模块可以做到这一点,但是如果你想要一个顺序文件名,基本的想法是:

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 :(得分:1)

打开用于书写的唯一文件名。将数组引用返回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;

}

答案 2 :(得分:0)

您可能需要查看File::Temp

类似的东西:

($fh, $filename) = tempfile('foo_XXXX', SUFFIX => '.bar');
print $fh "Some data\n";
close($fh) or die;