![]() |
|
Syntactic Confectionery Delight | |
PerlMonks |
How do I make a temporary file name?by faq_monk (Initiate) |
on Oct 08, 1999 at 00:23 UTC ( #647=perlfaq nodetype: print w/replies, xml ) | Need Help?? |
Current Perl documentation can be found at perldoc.perl.org. Here is our local, out-dated (pre-5.6) version:
Use the
use IO::File; $fh = IO::File->new_tmpfile() or die "Unable to make new temporary file: $!";
Or you can use the
use Fcntl; use POSIX qw(tmpnam);
# try new temporary filenames until we get one that didn't already # exist; the check should be unnecessary, but you can't be too careful do { $name = tmpnam() } until sysopen(FH, $name, O_RDWR|O_CREAT|O_EXCL);
# install atexit-style handler so that when we exit or die, # we automatically delete this temporary file END { unlink($name) or die "Couldn't unlink $name : $!" }
# now go on to use the file ... If you're committed to doing this by hand, use the process ID and/or the current time-value. If you need to have many temporary files in one process, use a counter:
BEGIN { use Fcntl; my $temp_dir = -d '/tmp' ? '/tmp' : $ENV{TMP} || $ENV{TEMP}; my $base_name = sprintf("%s/%d-%d-0000", $temp_dir, $$, time()); sub temp_file { local *FH; my $count = 0; until (defined(fileno(FH)) || $count++ > 100) { $base_name =~ s/-(\d+)$/"-" . (1 + $1)/e; sysopen(FH, $base_name, O_WRONLY|O_EXCL|O_CREAT); } if (defined(fileno(FH)) return (*FH, $base_name); } else { return (); } } }
|
|