创建线程安全的临时文件名

ilt*_*mpo 31 ruby filenames thread-safety temp

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

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

t = Tempfile.new(['fleischwurst', '.png'])
temp_path = t.path
t.close
t.unlink
Run Code Online (Sandbox Code Playgroud)

Jan*_*Jan 56

挖掘Dir::Tmpname.create你会注意到Errno::EEXIST包括tempfile.rb.在里面,你会找到Tempfile你所要求的.

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"
Run Code Online (Sandbox Code Playgroud)

在同一个文件Dir::Tmpname中,根据你想要实现的目标,还有一些比这更多make_tmpname.特别是,它确定了要使用的临时目录(假设您不在*nix上,这Dir::Tmpname.create是一个全局正确的假设).尽管如此,它还是有点难看,因为它需要一个块:

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"
Run Code Online (Sandbox Code Playgroud)

该块用于代码测试文件是否存在并引发,Errno::EEXIST以便可以生成新名称,并在末尾标记增量值.

  • 这很棒,但没有人提到你需要'要求'tmpdir'才能使这个工作. (3认同)