Wie kann ich einen temporären Dateinamen in Erlang erstellen?
Frage
Ich muß die Daten in einer Datei setzen, da meine andere Funktion eine Datei als Eingabe verwendet.
Wie kann ich einen eindeutigen Dateinamen in Erlang erstellen?
Gibt es so etwas wie Unix "tempfile" gibt es?
Lösung
Meinen Sie damit nur die acutal Dateinamen generieren? In diesem Fall wäre der sicherste Weg, um eine Mischung aus den Zahlen, die Sie ab jetzt () und die Hostnamen des Computers erhalten zu verwenden (wenn Sie das gleiche tun mehrere Knoten haben).
So etwas wie:
1> {A,B,C}=now().
{1249,304278,322000}
2> N=node().
nonode@nohost
3> lists:flatten(io_lib:format("~p-~p.~p.~p",[N,A,B,C])).
"nonode@nohost-1249.304278.322000"
4>
Andere Tipps
Sie können auch verwenden TMP = lib:nonl(os:cmd("mktemp")).
Oder Sie tun können,
erlang:phash2(make_ref())
für einen schnellen und einfachen einzigartigen indentifier. Einzigartig für bis zu 2 ^ 82 Anrufe, die enough.for Ihre Zwecke sein sollte. Das finde ich einfacher als die Formatierung einen Zeitstempel mit dem Knotennamen für den Einsatz.
Späte Antwort: Ich habe gerade bemerkt das test_server Modul, das Scratch-Verzeichnis Unterstützung hat, einen Blick wert
Ich habe dieses Problem endlich habe -. Und mein Benutzer wird eine Mischung aus Windows- und Linux-Systemen, so dass die alten erprobte und wahre lib:nonl(os:cmd("mktemp"))
Methode wird einfach nicht schneiden mehr
Also hier ist, wie ich es angesprochen habe, beide mit einer mktemp/1
Funktion, die einen Dateinamen zurückgibt, die verwendet werden können, und auch eine mktemp_dir/1
Funktion, die ein Verzeichnis zurückgibt (nachdem sie erstellt haben).
-spec mktemp(Prefix) -> Result
when Prefix :: string(),
Result :: {ok, TempFile :: file:filename()}
| {error, Reason :: file:posix()}.
mktemp(Prefix) ->
Rand = integer_to_list(binary:decode_unsigned(crypto:strong_rand_bytes(8)), 36),
TempPath = filename:basedir(user_cache, Prefix),
TempFile = filename:join(TempPath, Rand),
Result1 = file:ensure_dir(TempFile),
Result2 = file:write_file(TempFile, <<>>),
case {Result1, Result2} of
{ok, ok} -> {ok, TempFile};
{ok, Error} -> Error;
{Error, _} -> Error
end.
Und das Verzeichnis Version:
-spec mktemp_dir(Prefix) -> Result
when Prefix :: string(),
Result :: {ok, TempDir :: file:filename()}
| {error, Reason :: file:posix()}.
mktemp_dir(Prefix) ->
Rand = integer_to_list(binary:decode_unsigned(crypto:strong_rand_bytes(8)), 36),
TempPath = filename:basedir(user_cache, Prefix),
TempDir = filename:join(TempPath, Rand),
Result1 = file:ensure_dir(TempDir),
Result2 = file:make_dir(TempDir),
case {Result1, Result2} of
{ok, ok} -> {ok, TempDir};
{ok, Error} -> Error;
{Error, _} -> Error
end.
Beide tun im Grunde das gleiche: wir ein stark zufälligen Namen als binäres erhalten, dass String in einen base36 konvertieren, und hängen Sie ihn an, was auch immer die OS kehrt zu uns als sichere benutzer lokale temporäre Cache-Position <. / p>
Auf einem Unix-System-Typ, natürlich, wir filename:join(["/tmp", Prefix, Rand])
nur nutzen können, aber das Fehlen von /tmp
unter Windows ist eine Art der springende Punkt hier.