如何在 Erlang 中创建临时文件名?
我需要将数据放入文件中,因为我的其他函数将文件作为输入。
如何在 Erlang 中创建唯一的文件名?
是否存在像unix“tempfile”这样的东西?
I need to put data in a file since my other function takes a file as input.
How do I create a unique filename in Erlang?
Does something like unix "tempfile" exist?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
您的意思是只生成实际的文件名吗? 在这种情况下,最安全的方法是混合使用从 now() 获得的数字和计算机的主机名(如果您有多个节点执行相同的操作)。
就像是:
Do you mean just generate the acutal filename? In that case the safest way would be to use a mix of the numbers you get from now() and the hostname of your computer (if you have several nodes doing the same thing).
Something like:
您还可以使用
TMP = lib:nonl(os:cmd("mktemp"))。
You can also use
TMP = lib:nonl(os:cmd("mktemp")).
或者您可以使用
erlang:phash2(make_ref())
来获得快速且简单的唯一标识符。 最多可进行 2^82 次调用,这应该足以满足您的目的。 我发现这比使用节点名称格式化时间戳更容易。
Or you could do
erlang:phash2(make_ref())
for a quick and easy unique indentifier. Unique for up to 2^82 calls which should be enough.for your purposes. I find this easier than formatting a timestamp with node name for use.
迟到的答案:我刚刚注意到 test_server 模块具有暂存目录支持,值得一看
http://www.erlang.org/doc/man/test_server.html#temp_name-1
Late answer: I just noticed the test_server module which has scratch directory support, worth a look
http://www.erlang.org/doc/man/test_server.html#temp_name-1
我终于遇到了这个问题 - 而且我的用户混合使用 Windows 和 Linux 系统,因此旧的经过验证的
lib:nonl(os:cmd("mktemp"))
方法已经不再有效了。以下是我的处理方法,既使用返回可以使用的文件名的
mktemp/1
函数,也使用返回目录的mktemp_dir/1
函数(创建后)。目录版本:
这两者的作用基本上相同:我们获得一个强随机名称作为二进制文件,将其转换为 Base36 字符串,并将其附加到操作系统返回给我们的任何内容作为安全的用户本地临时缓存位置。
当然,在 unix 类型系统上,我们可以只使用
filename:join(["/tmp", Prefix, Rand])
,但在 Windows 上/tmp
不可用这就是重点。I've finally had this problem -- and my user is using a mix of Windows and Linux systems, so the old tried-and-true
lib:nonl(os:cmd("mktemp"))
method is just not going to cut it anymore.So here is how I've approached it, both with a
mktemp/1
function that returns a filename that can be used and also amktemp_dir/1
function that returns a directory (after having created it).And the directory version:
Both of these do basically the same thing: we get a strongly random name as a binary, convert that to a base36 string, and append it to whatever the OS returns to us as a safe user-local temporary cache location.
On a unix type system, of course, we could just use
filename:join(["/tmp", Prefix, Rand])
but the unavailability of/tmp
on Windows is sort of the whole point here.在 OTP 24 中,没有
file:ensure_dir
。 所以我做了类似的事情:对于目录:
对于文件:
In OTP 24 there is not
file:ensure_dir
. So I've made something similar:For directory:
For file: