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?

War es hilfreich?

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

http://www.erlang.org/doc/man /test_server.html#temp_name-1

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top