Secure temporary file: Difference between revisions

m
(Added Kotlin)
m (→‎{{header|Wren}}: Minor tidy)
 
(30 intermediate revisions by 20 users not shown)
Line 14:
This example creates a temporary file, writes to the file, then reads from the file.
 
<langsyntaxhighlight lang="ada">with Ada.Text_Io; use Ada.Text_Io;
 
procedure Temp_File is
Line 27:
Get_Line(File => Temp, Item => Contents, Last => Length);
Put_Line(Contents(1..Length));
end Temp_File;</langsyntaxhighlight>
 
=={{header|BBC BASIC}}==
==={{header|BBC BASIC}}===
{{works with|BBC BASIC for Windows}}
The file is automatically deleted when closed.
<langsyntaxhighlight lang="bbcbasic"> file% = FNopentempfile
IF file% = 0 ERROR 100, "Failed to open temp file"
PRINT #file%, "Hello world!"
Line 58 ⟶ 59:
IF hfile% = INVALID_HANDLE_VALUE THEN = 0
@hfile%(chan%) = hfile%
= chan%</langsyntaxhighlight>
'''Output:'''
<pre>
Hello world!
</pre>
 
==={{header|FreeBASIC}}===
{{trans|BBC BASIC}}
The file is deleted when closed.
<syntaxhighlight lang="vb">Dim As Long f
Dim As String message
 
f = Freefile
Open "temp.txt" For Output As #f
If Err > 0 Then Print "Failed to open temp"; f : End
Print #f, "Hello world!"
Close #f
 
Open "temp.txt" For Input As #f
Line Input #f, message
Close #f
Print message
 
Shell "del temp.txt"
 
Sleep</syntaxhighlight>
 
=={{header|C}}==
<langsyntaxhighlight lang="c">#include <stdlib.h>
#include <stdio.h>
 
Line 78 ⟶ 100:
time you open it. */
return 0;
}</langsyntaxhighlight>
 
The following {{works with|POSIX}}
<langsyntaxhighlight lang="c">#include <stdlib.h>
#include <stdio.h>
 
Line 92 ⟶ 114:
close(fd);
return 0;
}</langsyntaxhighlight>
 
=={{header|C sharp|C#}}==
 
<langsyntaxhighlight lang="csharp">using System;
using System.IO;
 
Console.WriteLine(Path.GetTempFileName());</langsyntaxhighlight>=={{header|C sharp|C#}}==
 
=={{header|C++}}==
<syntaxhighlight lang="c++">
#include <cstdio>
 
int main() {
// Creates and opens a temporary file with a unique auto-generated filename.
// If the program closes the file, the file is automatically deleted.
// The file is also automatically deleted if the program exits normally.
std::FILE* temp_file_pointer = std::tmpfile();
 
// Using functions which take a file pointer as an argument
std::fputs("Hello world", temp_file_pointer);
std::rewind(temp_file_pointer);
char buffer[12];
std::fgets(buffer, sizeof buffer, temp_file_pointer);
printf(buffer);
}
</syntaxhighlight>
{{ out }}
<pre>
Hello world
</pre>
 
=={{header|Clojure}}==
It is good practice to explicitly delete temp files immediately once they've been used.
<langsyntaxhighlight lang="clojure">(let [temp-file (java.io.File/createTempFile "pre" ".suff")]
; insert logic here that would use temp-file
(.delete temp-file))</langsyntaxhighlight>
 
=={{header|D}}==
{{works with|Tango}}
<langsyntaxhighlight lang="d">module tempfile ;
import tango.io.TempFile, tango.io.Stdout ;
 
Line 123 ⟶ 168:
 
// both can only be accessed by the current user (the program?).
}</langsyntaxhighlight>
=={{header|Delphi}}==
{{libheader| System.SysUtils}}
{{libheader| System.IOUtils}}
<syntaxhighlight lang="delphi">
program Secure_temporary_file;
 
{$APPTYPE CONSOLE}
 
uses
System.SysUtils,
System.IOUtils;
 
var
FileName, buf: string;
 
begin
FileName := TPath.GetTempFileName;
with TFile.Open(FileName, TFileMode.fmCreate, TFileAccess.faReadWrite,
Tfileshare.fsNone) do
begin
buf := 'This is a exclusive temp file';
Write(buf[1], buf.Length * sizeof(char));
Free;
end;
 
writeln(FileName);
Readln;
end.</syntaxhighlight>
 
=={{header|Emacs Lisp}}==
<code>make-temp-file</code> creates a new empty temporary file, with perms "0700" so read-write to the current user only.
 
<langsyntaxhighlight Lisplang="lisp">(make-temp-file "prefix")
;; => "/tmp/prefix25452LPe"</syntaxhighlight>
=>
 
"/tmp/prefix25452LPe"</lang>
=={{header|F_Sharp|F#}}==
<syntaxhighlight lang="fsharp">
printfn $"%s{System.IO.Path.GetTempFileName()}"
</syntaxhighlight>
{{out}}
<pre>
/tmp/tmpEuSgiY.tmp
</pre>
For the cynical who may not believe the file has been created
</pre>
nigel@nigel:/tmp$ ls *.tmp
tmpEuSgiY.tmp
</pre>
 
<code>make-temp-file</code> is available in GNU Emacs 21 up, but not XEmacs 21.4. The Gnus included with XEmacs 21.4 has an <code>mm-make-temp-file</code> in its <code>mm-util.el</code>, or the [[APEL]] library can supply a <code>make-temp-file</code> (and for Emacs 20 too).
 
=={{header|Fortran}}==
Supposing F is an integer variable, whose value might be 10. This is the I/O unit number, and would be used in READ(F,''etc.'' and WRITE(F,''etc.'' statements. <langsyntaxhighlight Fortranlang="fortran"> OPEN (F,STATUS = 'SCRATCH') !Temporary disc storage.</langsyntaxhighlight>
Other attributes might be specified depending on the intended usage, but note that no file name is given. When the file is closed, its storage vanishes back to the file system.
 
Line 142 ⟶ 227:
=={{header|Go}}==
Use <code>[https://golang.org/pkg/io/ioutil/#TempFile ioutil.TempFile]</code>
<langsyntaxhighlight lang="go">package main
 
import (
Line 173 ⟶ 258:
// The defer statements above will close and remove the
// temporary file here (or on any return of this function).
}</langsyntaxhighlight>
{{out}}
<pre>
Line 180 ⟶ 265:
 
=={{header|Groovy}}==
<langsyntaxhighlight lang="groovy">def file = File.createTempFile( "xxx", ".txt" )
 
// There is no requirement in the instructions to delete the file.
//file.deleteOnExit()
 
println file</langsyntaxhighlight>
 
Output:
Line 191 ⟶ 276:
 
=={{header|Haskell}}==
<langsyntaxhighlight lang="haskell">import System.IO
 
main = do (pathOfTempFile, h) <- openTempFile "." "prefix.suffix" -- first argument is path to directory where you want to put it
-- do stuff with it here; "h" is the Handle to the opened file
return ()</langsyntaxhighlight>
 
=={{header|HicEst}}==
<langsyntaxhighlight HicEstlang="hicest">! The "scratch" option opens a file exclusively for the current process.
! A scratch file is automatically deleted upon process termination.
 
Line 209 ⟶ 294:
OPEN( FIle='DenyForOthers', DenyREAdWRIte, IOStat=ErrNr)
WRITE(FIle='DenyForOthers') "something"
WRITE(FIle='DenyForOthers', DELETE=1)</langsyntaxhighlight>
 
=={{header|Icon}} and {{header|Unicon}}==
Line 215 ⟶ 300:
A posix-based solution that works in both languages:
 
<langsyntaxhighlight lang="unicon">procedure main()
write("Creating: ",fName := !open("mktemp","rp"))
write(f := open(fName,"w"),"Hello, world")
close(f)
end</langsyntaxhighlight>
 
=={{header|Java}}==
 
<langsyntaxhighlight lang="java">import java.io.File;
import java.io.IOException;
 
Line 237 ⟶ 322:
}
}
}</langsyntaxhighlight>
 
Alternative example
<syntaxhighlight lang="java">
import java.io.BufferedWriter;
import java.nio.file.Files;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
 
public final class SecureTemporaryFile {
 
public static void main(String[] args) throws IOException {
// Create a temporary file in the directory D:\.
// We should use java.nio.file.Files instead of the old java.io.File, as it is more secure.
// If the file cannot be created, it will throw an exception.
Path temporaryFilePath = Files.createTempFile(Path.of("D:/"), "example", ".tmp");
 
// For uniqueness, the Java API will insert a random number between the given prefix
// and the file extension.
System.out.println("Temporary file created: " + temporaryFilePath);
 
// Opening it with the following option will cause the file to be deleted when it is closed.
BufferedWriter tempFileWriter = Files.newBufferedWriter(
temporaryFilePath, StandardOpenOption.DELETE_ON_CLOSE);
// ... write to file, read it back in, close it...
}
 
}
</syntaxhighlight>
{{ out }}
<pre>
Temporary file created: D:\example12312088502442779987.tmp
</pre>
 
=={{header|Julia}}==
{{works with|Linux}} On Unix systems, Julia calls <code>mkstemp</code> to securely open a temporary file. This is likely multi-thread safe, check your system documentation for verification. This code should also work on Windows, but I've not verified that.
<syntaxhighlight lang="julia">
<lang Julia>
msg = "Rosetta Code, Secure temporary file, implemented with Julia."
 
Line 249 ⟶ 367:
close(tio)
println("\"", msg, "\" written to ", fname)
</syntaxhighlight>
</lang>
Files written to <code>\tmp</code> persist for the login session, and are thus truly temporary. If the environment variable <code>TMPDIR</code> is set, the temporary file is created in this directory. In this case, the file may not be properly temporary.
<syntaxhighlight lang="julia">
<lang Julia>
ENV["TMPDIR"] = pwd()
(fname, tio) = mktemp()
Line 258 ⟶ 376:
close(tio)
println("\"", msg, "\" written to ", fname)
</syntaxhighlight>
</lang>
 
{{out}}
Line 277 ⟶ 395:
 
=={{header|Kotlin}}==
<syntaxhighlight lang="kotlin">import kotlin.io.path.createTempFile
<lang scala>// version 1.1.2
import kotlin.io.path.deleteExisting
 
fun main() {
import java.io.File
val tempFilePath = createTempFile("example", ".tmp")
 
println("Temporary file created: $tempFilePath")
fun main(args: Array<String>) {
tempFilePath.deleteExisting()
try {
}</syntaxhighlight>
val tf = File.createTempFile("temp", ".tmp")
Sample output:
println(tf.absolutePath)
tf.delete()
}
catch (ex: Exception) {
println(ex.message)
}
}</lang>
Sample output (Ubuntu v14.04):
{{out}}
<pre>
Temporary file created: /tmp/example14437465325231438926.tmp
/tmp/temp1551492276377305257.tmp
</pre>
 
=={{header|Lua}}==
<langsyntaxhighlight lang="lua">fp = io.tmpfile()
 
-- do some file operations
 
fp:close()</langsyntaxhighlight>
 
=={{header|M2000 Interpreter}}==
tmp files automatic deleted when Environment end (per running environment)
 
<syntaxhighlight lang="m2000 interpreter">
Module Checkit {
\\ we get a tempname$ choosed from Windows
a$=tempname$
Try ok {
\\ we can use wide to export in utf-16le
\\ without wide we export as Ansi (set Local to desired language)
Rem Locale 1033 ' when no use of wide
Open a$ for wide output exclusive as #f
wait 10
\\ Notepad can't open, because we open it for exclusive use
Win "Notepad", a$
Print #f, "something"
Print "Press a key";Key$
Close #f
}
If error or not ok then Print Error$
Win "Notepad", a$
}
Checkit
 
</syntaxhighlight>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<syntaxhighlight lang="mathematica">tmp = OpenWrite[]
Close[tmp]</syntaxhighlight>
 
=={{header|Nanoquery}}==
<syntaxhighlight lang="nanoquery">import Nanoquery.IO
 
def guaranteedTempFile()
// create a file object to generate temp file names
$namegen = new(File)
 
// generate a temp filename
$tempname = $namegen.tempFileName()
// file names are generated with uuids so they shouldn't repeat
// in the case that they do, generate new ones until the generated
// filename is unique
$tempfile = new(File, $tempname)
while ($tempfile.exists())
$tempname = $namegen.tempFileName()
$tempfile = new(File, $tempname)
end
 
// create the file and lock it from writing
$tempfile.create()
lock $tempfile.fullPath()
 
// return the file reference
=={{header|Mathematica}}==
return $tempfile
<lang Mathematica>tmp = OpenWrite[]
end</syntaxhighlight>
Close[tmp]</lang>
 
=={{header|NetRexx}}==
{{incomplete|NetRexx|JVM Windows related bug workaround JDK-4715154}}<langsyntaxhighlight NetRexxlang="netrexx">/* NetRexx */
options replace format comments java crossref symbols binary
 
Line 340 ⟶ 505:
end
return
</syntaxhighlight>
</lang>
 
=={{header|Nim}}==
{{Works with|Nim|1.6.0}}
<syntaxhighlight lang="nim">import std/[os, tempfiles]
 
let (file, path) = createTempFile(prefix = "", suffix = "")
echo path, " created."
file.writeLine("This is a secure temporary file.")
file.close()
for line in path.lines:
echo line
removeFile(path)</syntaxhighlight>
{{out}}
<pre>/tmp/th7lDdkH created.
This is a secure temporary file.</pre>
 
=={{header|OCaml}}==
From the module Filename, one can use the functions [httphttps://caml.inriaocaml.frorg/pub/docs/manual-ocaml/librefapi/Filename.html#VALtemp_file temp_file] or [httphttps://camlocaml.inria.fr/pub/docs/manual-ocamlorg/librefapi/Filename.html#VALopen_temp_file open_temp_file]
<langsyntaxhighlight lang="ocaml"># Filename.temp_file "prefix." ".suffix" ;;
- : string = "/home/blue_prawn/tmp/prefix.301f82.suffix"</langsyntaxhighlight>
 
=={{header|Octave}}==
 
Octave has several related functions
<langsyntaxhighlight Matlablang="matlab"> [FID, MSG] = tmpfile(); % Return the file ID corresponding to a new temporary
filename = tmpnam (...); % generates temporary file name, but does not open file
[FID, NAME, MSG] = mkstemp (TEMPLATE, DELETE); % Return the file ID corresponding to a new temporary file with a unique name created from TEMPLATE.</langsyntaxhighlight>
 
=={{header|Pascal}}==
{{works with|Free_Pascal}}
{{libheader|SysUtils}}
<langsyntaxhighlight lang="pascal">Program TempFileDemo;
 
uses
Line 370 ⟶ 550:
writeln (tempFile, 5);
close (tempFile);
end.</langsyntaxhighlight>
 
=={{header|Perl}}==
function interface:
<langsyntaxhighlight lang="perl">use File::Temp qw(tempfile);
$fh = tempfile();
($fh2, $filename) = tempfile(); # this file stays around by default
print "$filename\n";
close $fh;
close $fh2;</langsyntaxhighlight>
 
object-oriented interface:
<langsyntaxhighlight lang="perl">use File::Temp;
$fh = new File::Temp;
print $fh->filename, "\n";
close $fh;</langsyntaxhighlight>
 
=={{header|Phix}}==
The temp_file() function (see builtins/pfile.e) can be used for this:
<!--<syntaxhighlight lang="phix">(notonline)-->
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span> <span style="color: #000080;font-style:italic;">-- (file i/o)</span>
<span style="color: #7060A8;">pp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">temp_file</span><span style="color: #0000FF;">())</span>
<span style="color: #0000FF;">{</span><span style="color: #004080;">integer</span> <span style="color: #000000;">fn</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">string</span> <span style="color: #000000;">name</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">temp_file</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"myapp/tmp"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"data"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"log"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"wb"</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">pp</span><span style="color: #0000FF;">({</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">name</span><span style="color: #0000FF;">})</span>
<span style="color: #7060A8;">close</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">)</span>
<span style="color: #0000FF;">{}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">delete_file</span><span style="color: #0000FF;">(</span><span style="color: #000000;">name</span><span style="color: #0000FF;">)</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
`C:\Users\Pete\AppData\Local\Temp\419750.tmp`
{3, `C:\Program Files (x86)\Phix\myapp\tmp\data408865.log`}
</pre>
If you don't provide an open mode (one of "w", "wb", "a", or "ab") then there is a 1-in-a-million
chance someone else will beat you to the punch; if you do provide one, it will open/loop for you.
 
=={{header|PHP}}==
<langsyntaxhighlight lang="php">$fh = tmpfile();
// do stuff with $fh
fclose($fh);
Line 396 ⟶ 594:
$filename = tempnam('/tmp', 'prefix');
echo "$filename\n";
// open $filename and do stuff with it</langsyntaxhighlight>
 
=={{header|PicoLisp}}==
Line 405 ⟶ 603:
they are (e.g. because such a file name is passed to a child process), explicit
locks with the 'ctl' functions are possible.
<langsyntaxhighlight PicoLisplang="picolisp">: (out (tmp "foo") (println 123)) # Write tempfile
-> 123
 
Line 413 ⟶ 611:
: (let F (tmp "foo")
(ctl F # Get exclusive lock
(in F
(let N (in F (read)) # Atomic increment
(outlet FN (printlnread) (inc N))) ) ) ) # Atomic increment
(out F (println (inc N))) ) ) ) )
-> 124</lang>
-> 124</syntaxhighlight>
 
=={{header|PowerShell}}==
<syntaxhighlight lang="powershell">
<lang PowerShell>
$tempFile = [System.IO.Path]::GetTempFileName()
Set-Content -Path $tempFile -Value "FileName = $tempFile"
Get-Content -Path $tempFile
Remove-Item -Path $tempFile
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 430 ⟶ 629:
 
=={{header|PureBasic}}==
<langsyntaxhighlight PureBasiclang="purebasic">Procedure.s TempFile()
Protected a, Result$
 
Line 454 ⟶ 653:
CloseFile(File)
EndIf
EndIf</langsyntaxhighlight>
 
=={{header|Python}}==
Line 461 ⟶ 660:
 
 
<langsyntaxhighlight lang="python">>>> import tempfile
>>> invisible = tempfile.TemporaryFile()
>>> invisible.name
Line 469 ⟶ 668:
'/tmp/tmpZNfc_s'
>>> visible.close()
>>> invisible.close()</langsyntaxhighlight>
 
 
Line 475 ⟶ 674:
 
 
<langsyntaxhighlight lang="python">fd, path = tempfile.mkstemp()
try:
# use the path or the file descriptor
finally:
os.close(fd)</langsyntaxhighlight>
 
=={{header|Racket}}==
 
<langsyntaxhighlight lang="racket">
#lang racket
(make-temporary-file)
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
(formerly Perl 6)
{{works with|Rakudo|2017.09}}
This is something best done with a module which is heavily tested, tries to account for all corner cases and automatically cleans up after itself.
 
Almost verbatim from the synopsis:
<syntaxhighlight lang="raku" line>use File::Temp;
 
# Generate a temp file in a temp dir
my ($filename0,$filehandle0) = tempfile;
 
# specify a template for the filename
# * are replaced with random characters
my ($filename1,$filehandle1) = tempfile("******");
 
# Automatically unlink files at DESTROY (this is the default)
my ($filename2,$filehandle2) = tempfile("******", :unlink);
 
# Specify the directory where the tempfile will be created
my ($filename3,$filehandle3) = tempfile(:tempdir("/path/to/my/dir"));
 
# don't unlink this one
my ($filename4,$filehandle4) = tempfile(:tempdir('.'), :!unlink);
 
# specify a prefix, a suffix, or both for the filename
my ($filename5,$filehandle5) = tempfile(:prefix('foo'), :suffix(".txt"));</syntaxhighlight>
 
=={{header|REXX}}==
REXX uses the underlying OS to create and delete the file.
<syntaxhighlight lang="rexx">/*REXX pgm secures (a temporary file), writes to it, displays the file, then deletes it.*/
parse arg tFID # . /*obtain optional argument from the CL.*/
if tFID=='' | tFID=="," then tFID= 'TEMP.FILE' /*Not specified? Then use the default.*/
if #=='' | #=="," then #= 6 /* " " " " " " */
call lineout tFID /*insure file is closed. */
rc= 0
say '··· creating file: ' tFID
call lineout tFID,,1 /*insure file is open and at record 1. */
if rc\==0 then call ser rc 'creating file' tFID /*issue error if can't open the file. */
say '··· writing file: ' tFID
 
do j=1 for # /*write a half-dozen records to file. */
call lineout tFID, 'line' j /*write a record to the file. */
if rc\==0 then call ser rc 'writing file' tFID /*Have an error? Issue err msg.*/
end /*j*/
 
call lineout tFID /*close the file. */
say '··· reading/display file: ' tFID
 
do j=1 while lines(tFID)>0 /*read the entire file and display it. */
x= linein(tFID) /*read a record from the file. */
if rc\==0 then call ser rc 'reading file' tFID /*Have an error? Issue err msg.*/
say 'line ' j " of file" tFID":" x /*display a record to the term. */
end /*j*/
 
call lineout tFID /*close the file. */
say '··· erasing file: ' tFID
'ERASE' tFID /*erase the file. */
exit 0 /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
ser: say; say '***error***' arg(1); say; exit 13 /*issue an error message to the term. */</syntaxhighlight>
{{out|output|text=&nbsp; when using the default input:}}
<pre>
··· creating file: TEMP.FILE
··· writing file: TEMP.FILE
··· reading/display file: TEMP.FILE
line 1 of file TEMP.FILE: line 1
line 2 of file TEMP.FILE: line 2
line 3 of file TEMP.FILE: line 3
line 4 of file TEMP.FILE: line 4
line 5 of file TEMP.FILE: line 5
line 6 of file TEMP.FILE: line 6
··· erasing file: TEMP.FILE
</pre>
 
=={{header|Ruby}}==
<syntaxhighlight lang ="ruby">irb(main):001:0> require 'tempfile'
 
=> true
irb(main):002:0> f = Tempfile.new('foo')
f.path # => #<File:"/tmp/foo20081226-307-10p746n-0>"
f.close
irb(main):003:0> f.path
f.unlink # => #<Tempfile: (closed)></syntaxhighlight>
=> "/tmp/foo20081226-307-10p746n-0"
 
irb(main):004:0> f.close
=={{header|Rust}}==
=> nil
<syntaxhighlight lang="rust">// 202100322 Rust programming solution
irb(main):005:0> f.unlink
 
=> #<Tempfile: (closed)></lang>
use tempfile::tempfile;
 
fn main() {
 
let fh = tempfile();
 
println!("{:?}", fh);
}</syntaxhighlight>
{{out}}
<pre>
Ok(File { fd: 3, path: "/tmp/#37224506 (deleted)", read: true, write: true })
</pre>
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">import java.io.{File, FileWriter, IOException}
 
def writeStringToFile(file: File, data: String, appending: Boolean = false) =
Line 518 ⟶ 803:
} catch {
case e: IOException => println(s"Running Example failed: ${e.getMessage}")
}</langsyntaxhighlight>
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">var tmpfile = require('File::Temp');
var fh = tmpfile.new(UNLINK => 0);
say fh.filename;
fh.print("Hello, World!\n");
fh.close;</langsyntaxhighlight>
 
=={{header|SparForte}}==
As a structured script.
<syntaxhighlight lang="ada">#!/usr/local/bin/spar
pragma annotate( summary, "tmpfile" );
pragma annotate( description, "Create a temporary file, securely and exclusively" );
pragma annotate( description, "(opening it such that there are no possible race" );
pragma annotate( description, "conditions). It's fine assuming local filesystem" );
pragma annotate( description, "semantics (NFS or other networking filesystems can" );
pragma annotate( description, "have signficantly more complicated semantics for" );
pragma annotate( description, "satisfying the 'no race conditions' criteria). The" );
pragma annotate( description, "function should automatically resolve name collisions" );
pragma annotate( description, "and should only fail in cases where permission is" );
pragma annotate( description, "denied, the filesystem is read-only or full, or similar" );
pragma annotate( description, "conditions exist (returning an error or raising an" );
pragma annotate( description, "exception as appropriate to the language/environment)." );
pragma annotate( see_also, "http://rosettacode.org/wiki/Secure_temporary_file" );
pragma annotate( author, "Ken O. Burtch" );
pragma license( unrestricted );
 
pragma restriction( no_external_commands );
 
procedure tmpfile is
temp : file_type;
contents : string;
begin
? "Creating a temporary file";
create( temp );
put_line( temp, "Hello World");
 
? "Reading a temporary file";
reset( temp, in_file);
contents := get_line( temp );
put_line( "File contains: " & contents );
 
? "Discarding a temporary file";
close( temp );
end tmpfile;</syntaxhighlight>
 
=={{header|Standard ML}}==
<langsyntaxhighlight lang="sml">val filename = OS.FileSys.tmpName ();</langsyntaxhighlight>
 
=={{header|Tcl}}==
{{works with|Tcl|8.6}}
Will store the name of the file in the variable <code>filenameVar</code> and an open read-write channel on the file in the variable <code>chan</code>.
<syntaxhighlight lang Tcl="tcl">set chan [file tempfile filenameVar]</langsyntaxhighlight>
Note that because we're asking for the filename in the script, Tcl does not automatically clean the file. (There are cases where auto-cleaning would be really unwanted.) If we hadn't asked for it, the file would be automatically deleted (at a time that depends on platform constraints).
 
=={{header|TUSCRIPT}}==
<langsyntaxhighlight lang="tuscript">
$$ MODE TUSCRIPT
tmpfile="test.txt"
Line 543 ⟶ 867:
FILE $tmpfile = text
- tmpfile "test.txt" can only be accessed by one user an will be deleted upon programm termination
</syntaxhighlight>
</lang>
 
=={{header|UNIX Shell}}==
Line 552 ⟶ 876:
thereunder.
 
<langsyntaxhighlight lang="bash">RESTOREUMASK=$(umask)
TRY=0
while :; do
Line 564 ⟶ 888:
cd "$MYTMP" || {
echo "Temporary directory failure on $MYTMP" >&2
exit 1; }</langsyntaxhighlight>
 
Note that the shell special variable $$ (the PID of the currently ''exec()''-ed shell) is unique at any given
Line 571 ⟶ 895:
This code will loop, picking new names and resetting the ''trap'' (clean-up command) until it succeeds in making
a directory. (Simple changes to the code could limit the number of attempts or implement a timeout).
 
=={{header|Wren}}==
{{libheader|Wren-ioutil}}
{{libheader|Wren-fmt}}
<syntaxhighlight lang="wren">import "random" for Random
import "./ioutil" for File, FileUtil
import "./fmt" for Fmt
 
var rand = Random.new()
 
var createTempFile = Fn.new { |lines|
var tmp
while (true) {
// create a name which includes a random 6 digit number
tmp = "/tmp/temp%(Fmt.swrite("$06d", rand.int(1e6))).tmp"
if (!File.exists(tmp)) break
}
FileUtil.writeLines(tmp, lines)
return tmp
}
 
var lines = ["one", "two", "three"]
var tmp = createTempFile.call(lines)
System.print("Temporary file path: %(tmp)")
System.print("Original contents of temporary file:")
System.print(File.read(tmp))
 
// append some more lines
var lines2 = ["four", "five", "six"]
FileUtil.appendLines(tmp, lines2)
System.print("Updated contents of temporary file:")
System.print(File.read(tmp))
File.delete(tmp)
System.print("Temporary file deleted.")</syntaxhighlight>
 
{{out}}
Sample run:
<pre>
Temporary file path: /tmp/temp574327.tmp
Original contents of temporary file:
one
two
three
 
Updated contents of temporary file:
one
two
three
four
five
six
 
Temporary file deleted.
</pre>
 
=={{header|zkl}}==
9,476

edits