使用Tempfile
Ruby正在創建一個具有線程安全和進程間安全名稱的文件。我只需要這樣的文件名。創建線程安全的臨時文件名
我在想,如果有一個更直接的方法方式比:
t = Tempfile.new(['fleischwurst', '.png'])
temp_path = t.path
t.close
t.unlink
使用Tempfile
Ruby正在創建一個具有線程安全和進程間安全名稱的文件。我只需要這樣的文件名。創建線程安全的臨時文件名
我在想,如果有一個更直接的方法方式比:
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
,這樣一個新的名字可以增加值標籤上生成結束。
我發現Dir: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
你用你需要「臨時文件」 需要「臨時文件」迪爾:: Tmpname.make_tmpname「/ tmp目錄/一滴」目錄:: Tempname ID,之前無 如果您還沒有加載「將它視爲」,那麼你不會能夠使用它的擴展Dir –
@ScottThompson是的,謝謝。 – dinman2022
謝謝,就是這樣。可以與數組參數一起使用以保留文件擴展名:'Dir :: Tmpname.make_tmpname(['a','.png'],nil)' – iltempo
@iltempo,不客氣。我已將您的示例添加到答案中。 – Jan
這很棒,但沒有人提到你需要'需要'tmpdir'這個工作。 – KingBob