题
我需要把数据在文件中,因为我的其他函数需要一个文件作为输入。
如何创建在二郎一个唯一的文件名?
请问像UNIX中的 “临时文件” 的存在?
解决方案
你的意思是刚才生成的文件名acutal?在这种情况下,最安全的方法是使用你从现在得到的数字()和您的计算机的主机名的混合(如果你有几个节点做同样的事情)。
是这样的:
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>
其他提示
您还可以使用TMP = lib:nonl(os:cmd("mktemp")).
或者你可以做
erlang:phash2(make_ref())
有一个快速简便的独特indentifier。独特的高达2 ^ 82的呼叫这应该是你的enough.for目的。我觉得这不是格式与节点名时间戳使用更方便。
迟到的回答:我只注意到它具有临时目录支持test_server模块,值得一看
我终于有这个问题 - 和我的用户使用的是Windows和Linux系统的组合,所以旧的尝试和真正的lib:nonl(os:cmd("mktemp"))
方法只是不会削减它了。
因此,这里是我如何与一个mktemp/1
函数返回返回目录(在已创建它),可以使用的文件名,也是一个mktemp_dir/1
功能走近它,无论是。
-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.
和目录版本:
-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.
这两个基本上做同样的事情:我们得到了一个强烈的随机名称的二进制文件,将其转换成一个base36字符串,并将其追加到任何操作系统返回到我们作为一个安全的用户本地临时缓存位置<。 / p>
在Unix类型的系统,当然,我们可以只使用filename:join(["/tmp", Prefix, Rand])
但/tmp
在Windows上不可用几分这里的关键所在。
不隶属于 StackOverflow