-->

创建一个线程安全的临时文件名(Creating a thread-safe temporary fi

2019-08-03 18:12发布

当使用Tempfile红宝石与创建一个线程安全和进程间安全名称的文件。 我只有这样需要一个文件名。

我在想,如果有一个更直接的方法方式比:

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

Answer 1:

tempfile.rb你会发现, Tempfile包括Dir::Tmpname 。 在里面你会发现make_tmpname它做你要求什么。

Dir::Tmpname.make_tmpname "/tmp/źdźbło", nil
# => "/tmp/źdźbło20121209-1867-1qyptqe"
Dir::Tmpname.make_tmpname(['a', '.png'], nil)
# => "a20121209-2710-wcjbzr.png"

在同一文件中,也Dir::Tmpname.create其中,取决于你想要达到的目标,做多一点make_tmpname 。 特别是,它断定哪些临时目录使用(假设你没有在* nix这里/tmp是一个全局正确的假设)。 不过,有点丑陋使用给定的,它需要一个块:

Dir::Tmpname.create(['a', '.png']) { }
# => "/tmp/a20140224-15930-l9sc6n.png"

该块是有代码来测试该文件是否存在并发出Errno::EEXIST使得可以与递增标记在结束值中产生一个新的名字。



Answer 2:

既然你只需要在文件名,怎么样使用的SecureRandom为:

require 'securerandom'

filename =  "#{SecureRandom.hex(6)}.png" #=> "0f04dd94addf.png"

您还可以使用SecureRandom.alphanumeric



Answer 3:

由于Dir::Tmpname.make_tmpname是用Ruby 2.5.0删除 ,这一回退到使用SecureRandom

require "tmpdir"

def generate_temp_filename(ext=".png")
  filename = begin
    Dir::Tmpname.make_tmpname(["x", ext], nil)
  rescue NoMethodError
    require "securerandom"
    "#{SecureRandom.urlsafe_base64}#{ext}"
  end
  File.join(Dir.tmpdir, filename)
end


Answer 4:

我发现导演:Tmpname解决方案并没有为我工作。 当评估这样的:

Dir::Tmpname.make_tmpname "/tmp/blob", nil

在MRI红宝石1.9.3p194我得到:

uninitialized constant Dir::Tmpname (NameError)

在JRuby的1.7.5(1.9.3p393)我得到:

NameError: uninitialized constant Dir::Tmpname

你可以尝试这样的事:

def temp_name(file_name='', ext='', dir=nil)
    id   = Thread.current.hash * Time.now.to_i % 2**32
    name = "%s%d.%s" % [file_name, id, ext]
    dir ? File.join(dir, name) : name
end


文章来源: Creating a thread-safe temporary file name