当使用Tempfile
红宝石与创建一个线程安全和进程间安全名称的文件。 我只有这样需要一个文件名。
我在想,如果有一个更直接的方法方式比:
t = Tempfile.new(['fleischwurst', '.png'])
temp_path = t.path
t.close
t.unlink
当使用Tempfile
红宝石与创建一个线程安全和进程间安全名称的文件。 我只有这样需要一个文件名。
我在想,如果有一个更直接的方法方式比:
t = Tempfile.new(['fleischwurst', '.png'])
temp_path = t.path
t.close
t.unlink
挖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
使得可以与递增标记在结束值中产生一个新的名字。
既然你只需要在文件名,怎么样使用的SecureRandom为:
require 'securerandom'
filename = "#{SecureRandom.hex(6)}.png" #=> "0f04dd94addf.png"
您还可以使用SecureRandom.alphanumeric
由于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
我发现导演: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