Question

Je dois mettre des données dans un fichier car mon autre fonction prend un fichier en entrée.

Comment créer un nom de fichier unique dans Erlang?

Fait quelque chose comme unix " tempfile " existe?

Était-ce utile?

La solution

Voulez-vous dire simplement générer le nom de fichier exact? Dans ce cas, le moyen le plus sûr serait d'utiliser une combinaison des nombres que vous obtenez à partir de maintenant () et du nom d'hôte de votre ordinateur (si vous avez plusieurs nœuds faisant la même chose).

Quelque chose comme:

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> 

Autres conseils

Vous pouvez également utiliser TMP = lib: nonl (os: cmd ("mktemp")).

Ou vous pourriez faire

erlang: phash2 (make_ref ())

pour un identifiant unique rapide et facile. Unique pour 2 ^ 82 appels au maximum, ce qui devrait suffire à vos besoins. Je trouve cela plus facile que de formater un horodatage avec le nom du noeud à utiliser.

Réponse tardive: je viens de remarquer le module test_server qui prend en charge les répertoires de travail, mérite un coup d'oeil

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

J'ai finalement eu ce problème - et mon utilisateur utilise une combinaison de systèmes Windows et Linux, donc l'ancien libéré non-éprouvé (vrai: code) lib: nonl (os: cmd ("mktemp")) ne va tout simplement pas la couper.

Voici donc comment je l'ai abordé, à la fois avec une fonction mktemp / 1 qui renvoie un nom de fichier pouvant être utilisé, ainsi qu'une fonction mktemp_dir / 1 retourne un répertoire (après l'avoir créé).

-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.

Et la version du répertoire:

-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.

Les deux font la même chose: nous obtenons un nom fortement aléatoire en tant que binaire, nous le convertissons en chaîne base36 et nous l'ajoutons à tout ce que le système d'exploitation nous renvoie comme emplacement de cache temporaire pour l'utilisateur local sécurisé.

Sur un système de type Unix, bien sûr, nous pourrions simplement utiliser nomfichier: join (["/ tmp", préfixe, Rand]) mais l'indisponibilité de / tmp sur Windows est en quelque sorte le point entier ici.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top