我需要把数据放进一个文件里,因为我的其他函数需要以文件作为输入。
在Erlang中如何创建唯一的文件名?
类似于Unix的“tempfile”这样的东西是否存在?
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"))
。
string:strip(os:cmd("mktemp"), right, $\n)
可以避免通常会在末尾返回的令人讨厌的不可见换行符。 - zxq9lib:nonl( os:cmd( "mktemp" ) )
。 - Vojta Rylko或者你可以使用 erlang:phash2(make_ref())
来快速、轻松地生成一个唯一标识符。对于你的目的来说,这个标识符在最多 2^82 次调用时是唯一的,应该足够了。我发现这比使用节点名称格式化时间戳更容易。
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 = filelib: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 = filelib:ensure_dir(TempDir),
Result2 = file:make_dir(TempDir),
case {Result1, Result2} of
{ok, ok} -> {ok, TempDir};
{ok, Error} -> Error;
{Error, _} -> Error
end.
filename:join(["/tmp", Prefix, Rand])
,但是Windows上/tmp
不可用是整个问题的重点。ensure_dir(Name)
在 filelib
模块中。链接 - https://erlang.org/doc/man/filelib.html#ensure_dir-1 - Anatolii Kosorukovstdlib.h
中有mkstemp
的原因。GNU coreutils中的mktemp
内部使用mkstemp
调用。 - Hynek -Pichi- Vychodilfile:ensure_dir
。因此我做了类似的东西:mktemp_dir(Prefix) ->
Rand = integer_to_list(binary:decode_unsigned(crypto:strong_rand_bytes(8)), 36),
TempDir = filename:basedir(user_cache, Prefix),
[]= os:cmd("mkdir " ++ "\"" ++ TempDir ++ "\""),
{ok, _} = file:list_dir(TempDir),
TempDir.
文件名称:
mktemp(Prefix) ->
Rand = integer_to_list(binary:decode_unsigned(crypto:strong_rand_bytes(8)), 36),
TempDir = filename:basedir(user_cache, Prefix),
TempFile = filename:join(TempDir, Rand),
[]= os:cmd("mkdir " ++ "\"" ++ TempDir ++ "\""),
{ok, _} = file:list_dir(TempDir),
Result = file:write_file(TempFile, <<>>),
case {Result} of
{ok} -> {ok, TempFile};
{Error} -> Error
end.
erlang:now/0
已经被弃用,请使用erlang:unique_integer/0
(文档) 替代。 - clonejo