7.11. Creating Temporary Files
7.11.1. Problem
You need to create a temporary file and
have it deleted automatically when your program exits. For instance,
if you needed a temporary configuration file to feed a program you''re
about to launch, you''d need a name for that file so you could pass
that filename along to the utility program. In other cases, you may
want a temporary file to write to and read from, but don''t need a
filename for it.
7.11.2. Solution
Use the
tempfile function from the File::Temp module:
use File::Temp qw/ tempdir /;
$fh = tempfile( ); # just the handle
perhaps in conjunction with a temporary directory:
use File::Temp qw/ tempdir /;
# or specify a directory
$dir = tempdir( CLEANUP => 1 );
($fh, $filename) = tempfile( DIR => $dir );
$template = "myprogtempXXXXXX"; # trailing Xs are changed
($fh, $filename) = tempfile( $template, DIR => $dir);
($fh, $filename) = tempfile( $template, SUFFIX => ".data");
7.11.3. Discussion
The File::Temp module''s functions are the best way to make temporary
files. For one thing, they''re extremely easy to use. For another,
they''re more portable than direct calls to the operating system. But
perhaps of greatest importance is the care they take in security
matters both various and subtle, especially those involving race
conditions.Although this module provides a handful of slightly different
functions for creating a temporary file, most are there simply to
support legacy interfaces; few users will need more than the basic
tempfile( ) function. This function safely and
atomically creates and opens a brand new, empty file in read-write
mode. In scalar context, it returns a filehandle to that temporary
file; in list context, it returns the handle and pathname of the
temporary file:
use File::Temp qw(tempfile);
# just the handle
$fh = tempfile( );
# handle and filename
($fh, $filename) = tempfile( );
The tempfile function optionally accepts an
argument containing a template and then named arguments in pairs.
Named arguments specify such things as the directory to use instead
of the current directory, that a specific file extension should be
used, and on systems that support such a thing, whether the tempfile
should be immediately unlinked before its handle is returned. (Files
whose names have already been deleted from the filesystem are
especially difficult for the guys with the black hats to find.) Any
trailing X characters in the template are replaced by random
characters in the final filename. You might use this feature if you
need a temporary file with a specific extension.
($fh, $filename) = tempfile(DIR => $dir);
($fh, $filename) = tempfile($template);
($fh, $filename) = tempfile($template, DIR => $dir);
($fh, $filename) = tempfile($template, SUFFIX => ".dat");
($fh, $filename) = tempfile($template, UNLINK => 1);
Unless you specify OPEN => 0, the temporary
file will be deleted automatically when your program finally exits or
the file is closed.In recent releases, Perl''s
open function offers a simple way to create
temporary files whose names you cannot know. Explicitly pass
undef as the filename to open:
open(my $fh, "+>", undef)
or die "$0: can''t create temporary file: $!\n";
7.11.4. See Also
The documentation for the standard File::Temp modules (also in
Chapter 32 of Programming Perl); the
open function in perlfunc(1)
and in Chapter 29 of Programming Perl; Recipe 7.9