use Fcntl qw(O_CREAT O_EXCL O_WRONLY); my $i; while(1) { my $dest = compose_name($base, $ext, $i++); if(sysopen my $fh, $dest, O_CREAT | O_EXCL | O_WRONLY) { close $fh; my $tempfile = generate_tempfilename($destdir); copy $source, $tempfile; rename $tempfile, $dest; # should replace file last; } }