如何生成随机唯一临时文件名?

时间:2010-10-12 11:21:59

标签: perl

我正在尝试使用以下代码创建临时文件:

 use File::Temp  ;
 $tmp = File::Temp->new( TEMPLATE => 'tempXXXXX',
                        DIR => 'mydir',
                        SUFFIX => '.dat');

这是创建临时文件。由于我的权限问题,其他程序无法写入文件。

所以我只想生成文件名而不创建文件。有什么地方可以做到吗?

4 个答案:

答案 0 :(得分:10)

如果在创建名称的同时未创建文件,则可以在手动创建文件之前创建具有相同名称的文件。如果您需要打开不同的进程,请先关闭它:

#!/usr/bin/perl

use strict;
use warnings;

use File::Temp;

sub get_temp_filename {
    my $fh = File::Temp->new(
        TEMPLATE => 'tempXXXXX',
        DIR      => 'mydir',
        SUFFIX   => '.dat',
    );

    return $fh->filename;
}

my $filename = get_temp_filename();

open my $fh, ">", $filename
    or die "could not open $filename: $!";

处理权限问题的最佳方法是确保运行这两个程序的用户都在同一个组中。然后,您可以使用chmod更改第一个程序内的权限,以允许第二个程序(或该组中的任何用户)修改该文件:

my $filename = get_temp_filename();

chmod 0660, $filename;

答案 1 :(得分:7)

只需获取您可以执行的临时文件的名称:

#!/usr/bin/perl
use strict;
use warnings;
use 5.10.1;

use File::Temp qw/tempfile/;

my $file;

(undef, $file) = tempfile('tmpXXXXXX', OPEN=>0);

say $file;

但是作为查斯。欧文斯说,在使用它之前,请注意可以创建相同的名称。

答案 2 :(得分:4)

Chas提出的get_temp_filename函数。 Owens使用一个本地文件句柄对象($ fh),它在函数返回时被销毁,导致创建的tempfile销毁。

要避免这种情况,请保持文件(风险较小)添加:

UNLINK => 0

new方法参数,禁止在对象删除时解除文件链接。

答案 3 :(得分:1)

实际上,我同意Chas.Owens--设计存在致命缺陷。

你真的觉得需要修改设计,所以:

如果您已控制第二个程序,请 程序创建文件名,并将文件名传递给第一个程序。

但是,如果第二个程序不是你写的东西,所以你不能修改它,那么我推荐以下之一:

1 - 使用第一个进程PID作为文件名的一部分,以尽量减少重复文件名的风险。

2 - 让第二个程序将其输出输出到第一个程序,根本不用担心文件。就个人而言,这是一个比1更好的解决方案。

3 - 将第二个程序包装在一个脚本(shell,perl,无论如何)中,创建名称和文件并将其传递给两个程序。