Wie erstelle ich einen temporären Dateinamen in Erlang?

8

Ich muss Daten in eine Datei schreiben, da meine andere Funktion eine Datei als Eingabe akzeptiert.

Wie erstelle ich einen eindeutigen Dateinamen in Erlang?

Gibt es so etwas wie unix "tempfile"?

    
Fu. 03.08.2009, 12:30
quelle

5 Antworten

12

Meinst du nur den tatsächlichen Dateinamen erzeugen? In diesem Fall wäre der sicherste Weg, eine Mischung aus den Zahlen zu verwenden, die Sie ab sofort erhalten () und dem Hostnamen Ihres Computers (wenn Sie mehrere Knoten haben, die dasselbe tun).

Etwas wie:

%Vor%     
Mazen Harake 03.08.2009, 12:59
quelle
9

Sie können auch TMP = lib:nonl(os:cmd("mktemp")).

verwenden     
Hynek -Pichi- Vychodil 03.08.2009 15:44
quelle
6

Oder Sie könnten

tun

erlang:phash2(make_ref())

für einen schnellen und einfachen eindeutigen Identifizierer. Einzigartig für bis zu 2 ^ 82 Anrufe, die ausreichen sollten.für Ihre Zwecke. Ich finde das einfacher als einen Zeitstempel mit Knotennamen für die Verwendung zu formatieren.

    
Jeremy Wall 06.08.2009 00:14
quelle
1

Verspätete Antwort: Ich habe gerade das Modul test_server bemerkt, das die Unterstützung von Scratch-Verzeichnissen hat, einen Blick wert

Ссылка

    
Gene T 06.09.2009 15:34
quelle
0

Ich hatte dieses Problem endlich - und mein Benutzer benutzt eine Mischung aus Windows- und Linux-Systemen, also wird die altbewährte Methode lib:nonl(os:cmd("mktemp")) sie nicht mehr schneiden.

Also hier ist, wie ich es angegangen bin, sowohl mit einer Funktion mktemp/1 , die einen Dateinamen zurückgibt, die verwendet werden kann, als auch einer mktemp_dir/1 Funktion, die ein Verzeichnis zurückgibt (nachdem es erstellt wurde).

%Vor%

Und die Verzeichnisversion:

%Vor%

Beides funktioniert grundsätzlich genauso: Wir erhalten einen stark zufälligen Namen als Binärdatei, wandeln diesen in eine base36-Zeichenkette um und hängen sie an das an, was das Betriebssystem uns als sicheren lokalen temporären Cache-Speicherort zurückgibt.

Auf einem Unix-System könnten wir natürlich filename:join(["/tmp", Prefix, Rand]) verwenden, aber die Nichtverfügbarkeit von /tmp unter Windows ist hier eine Frage.

    
zxq9 12.08.2017 04:36
quelle

Tags und Links