J'ai besoin de mettre des données dans un fichier car mon autre fonction prend un fichier comme entrée. P>
Comment créer un nom de fichier unique à Erlang? p>
fait quelque chose comme unix "tempfile" exister? P>
6 Réponses :
Voulez-vous simplement générer le nom de fichier acutal? Dans ce cas, la manière la plus sûre serait d'utiliser un mélange de chiffres que vous obtenez d'ici () et du nom d'hôte de votre ordinateur (si vous avez plusieurs nœuds qui font la même chose).
Quelque chose comme: p> < Pré> xxx pré> p>
Comme tout le monde n'est pas conscient de cela: des appels à Erlang: maintenant () sont garantis pour renvoyer des résultats uniques à chaque fois. Propriété assez utile ...
Oui, très utile. Il y a une autre chose qui est très utile avec cette façon de générer une référence; Vous obtenez la nodename là-bas qui est très utile si vous souhaitez d'abord vous assurer que l'ID est toujours unique (vous pouvez le traiter comme une référence locale) et une seconde à savoir d'où provient la référence. Dans notre système (avec n nœuds dans le cluster et les datables partagés, etc.), nous pouvons facilement trouver les journaux et informations dont nous avons besoin sur un travail utilisant cet identifiant uniquement (nœud + heure).
Cela échouera si un tel fichier existe déjà. Erlang: Maintenant () Impossible de garantir que le fichier n'existe pas.
Erlang: maintenant / 0 code> est obsolète, utilisez
erlang: unique_integer / 0 code> (
Cela a la faiblesse qu'il ne protège pas contre une collision de nom entre deux processus concurrents. Il est possible que deux processus génèrent le nom de fichier au même microseconde. Je traite actuellement une insuffisance de construction intermittente due à l'utilisation d'un outil de construction de ce nom TMPFile basé sur l'horodatage. Utilisez la solution MKTemp à la place.
Vous pouvez également utiliser TMP = lib: nonL (OS: cmd ("mktemp")). code> p>
Légèrement plus laidule, mais String: Strip (OS: CMD ("MKTemp"), Droite, $ \ N) Code> peut éviter que cette nouvelle ligne invisible ne soit généralement renvoyée à la fin.
Version plus courte: in: non (OS: commande ("mktemp")) code>.
ou vous pouvez faire p>
pour un indentificateur unique rapide et facile. Unique pour des appels allant jusqu'à 2 ^ 82 qui devrait suffire. Pour vos besoins. Je trouve cela plus facile que le formatage d'un horodatage avec nom de nœud à utiliser. P> erlang: phash2 (make_ref ()) code> p>
Réponse tardive: Je viens de remarquer le module Test_Server qui possède un support de répertoire de gratter, vaut la peine de regarder p>
http://www.erlang.org/doc/man /Test_Server.html#temp_name-1 P>
Cela ne garantit pas que ce fichier n'existera pas dans le temps que vous allez essayer de faire ce fichier. Donc, ce n'est pas sécurisé. C'est pourquoi il y a mkystemp code> dans
stdlib.h code>.
mktemp code> de gnu cortitils utilise
mkstemp code> appel interne.
J'ai enfin eu ce problème - et mon utilisateur utilise un mélange de systèmes Windows et Linux, de sorte que l'ancien eye-and-true Voici comment je m'approche, avec une fonction et la version répertoire: p> lib: nonL (OS: cmd ("mktemp")) / Code> La méthode ne va tout simplement pas le couper.
mktemp / 1 code> qui renvoie un nom de fichier qui peut être utilisé et aussi une fonction
mktemp_dir / 1 code> qui renvoie un répertoire (après l'avoir créée). p>
-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 = filelib:ensure_dir(TempDir),
Result2 = file:make_dir(TempDir),
case {Result1, Result2} of
{ok, ok} -> {ok, TempDir};
{ok, Error} -> Error;
{Error, _} -> Error
end.
Fonction S'assurer_dir (Nom) CODE> est dans
Module FileLIB code>. Lien - erlang.org/doc/man/filelib.html#ensure_dir-1 < / a>
En effet! Merci d'avoir attrapé ça. Fixé. Je devrais probablement faire un message de blog sur les différents modules de fichier * et io * pour donner aux gens une tête de démarrage sur la manière de trouver le type de fonction où. Cela n'était certainement pas évident pour moi la première fois.
dans OTP 24 Il n'y a pas pour le répertoire: p> pour fichier: p> Fichier: S'assurer_dir code>. Donc, j'ai fait quelque chose de similaire: