gpt4 book ai didi

ruby - 创建一个线程安全的临时文件名

转载 作者:数据小太阳 更新时间:2023-10-29 06:25:35 25 4
gpt4 key购买 nike

当使用 Tempfile 时,Ruby 正在创建一个具有线程安全和进程间安全名称的文件。这样我只需要一个文件名。

我想知道是否有比以下更直接的方法:

t = Tempfile.new(['fleischwurst', '.png'])
temp_path = t.path
t.close
t.unlink

最佳答案

Dir::Tmpname.create

您可以使用 Dir::Tmpname.create。它找出要使用的临时目录(除非您向它传递一个目录)。考虑到它需要一个 block ,使用起来有点难看:

require 'tmpdir'
# => true
Dir::Tmpname.create(['prefix-', '.ext']) {}
# => "/tmp/prefix-20190827-1-87n9iu.ext"
Dir::Tmpname.create(['prefix-', '.ext'], '/my/custom/directory') {}
# => "/my/custom/directory/prefix-20190827-1-11x2u0h.ext"

该 block 用于测试文件是否存在并引发 Errno::EEXIST 的代码,以便可以生成一个新名称,并在末尾附加递增的值。

Rails 解决方案

Ruby on Rails实现的解决方案很简短,类似于最初在 Ruby 中实现的解决方案:

require 'tmpdir'
# => true
File.join(Dir.tmpdir, "YOUR_PREFIX-#{Time.now.strftime("%Y%m%d")}-#{$$}-#{rand(0x100000000).to_s(36)}-YOUR_SUFFIX")
=> "/tmp/YOUR_PREFIX-20190827-1-wyouwg-YOUR_SUFFIX"
File.join(Dir.tmpdir, "YOUR_PREFIX-#{Time.now.strftime("%Y%m%d")}-#{$$}-#{rand(0x100000000).to_s(36)}-YOUR_SUFFIX")
=> "/tmp/YOUR_PREFIX-20190827-1-140far-YOUR_SUFFIX"

Dir::Tmpname.make_tmpname(Ruby 2.5.0 及更早版本)

Dir::Tmpname.make_tmpname was removed in Ruby 2.5.0. Prior to Ruby 2.4.4 it could accept a directory path as a prefix, but as of Ruby 2.4.4, directory separators are removed.

深入研究 tempfile.rb,您会注意到 Tempfile 包括 Dir::Tmpname。在里面你会发现 make_tmpname这会满足您的要求。

require 'tmpdir'
# => true
File.join(Dir.tmpdir, Dir::Tmpname.make_tmpname("prefix-", nil))
# => "/tmp/prefix-20190827-1-dfhvld"
File.join(Dir.tmpdir, Dir::Tmpname.make_tmpname(["prefix-", ".ext"], nil))
# => "/tmp/prefix-20190827-1-19zjck1.ext"
File.join(Dir.tmpdir, Dir::Tmpname.make_tmpname(["prefix-", ".ext"], "suffix"))
# => "/tmp/prefix-20190827-1-f5ipo7-suffix.ext"

关于ruby - 创建一个线程安全的临时文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13787746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com