Как я могу генерировать случайные уникальные имена временных файлов? - PullRequest
5 голосов
/ 12 октября 2010

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

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

Это создать временный файл.Из-за моего разрешения другая программа не может записать в файл.

Так что я просто хочу сгенерировать имя файла без создания файла.Есть ли где это сделать?

Ответы [ 4 ]

10 голосов
/ 12 октября 2010

Если вы не создаете файл одновременно с созданием имени, возможно, файл с таким же именем будет создан до того, как вы создадите файл вручную. Если вам нужен другой процесс, откройте файл, просто сначала закройте его:

#!/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;
7 голосов
/ 12 октября 2010

Просто чтобы получить имя временного файла вы можете сделать:

#!/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;

Но как Chas.Оуэнс сказал, что будь осторожен, одно и то же имя можно создать, прежде чем использовать его.

4 голосов
/ 18 марта 2011

Функция get_temp_filename, предложенная Chas. Owens использует локальный объект дескриптора файла ($ fh), который уничтожается при возврате функции, что приводит к уничтожению созданного временного файла.

Чтобы избежать этого и, следовательно, сохранить файл (меньше риска), добавьте:

UNLINK => 0

к аргументам метода new, запрещающим отсоединение файла во время удаления объекта.

1 голос
/ 17 февраля 2016

На самом деле, я согласен с Chas.Owens - дизайн фатально испорчен.

Такое ощущение, что вам нужно исправить дизайн, поэтому:

Если у вас есть контроль над 2-й программой, пусть эта программа создаст имя файла и файла и передаст имя файла 1-й программе.


Но если 2-я программа - это не то, что вы написали, и поэтому вы не можете ее изменить, я бы порекомендовал одно из следующего:

1 - использовать PID первых процессов в качестве части имени файла, чтобы минимизировать риск дублирования имен файлов.

2 - Пусть 2-я программа передает свои выходные данные в 1-ю программу, вообще не думайте о файле. Лично это гораздо лучшее решение, чем 1.

3 - Обернуть вторую программу в скрипт (shell, perl и т. Д.), Который создает имя и файл и передает их обеим программам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...