2012-12-09 21 views
28

使用Tempfile Ruby正在創建一個具有線程安全和進程間安全名稱的文件。我只需要這樣的文件名。創建線程安全的臨時文件名

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

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

回答

51

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,這樣一個新的名字可以增加值標籤上生成結束。

+0

謝謝,就是這樣。可以與數組參數一起使用以保留文件擴展名:'Dir :: Tmpname.make_tmpname(['a','.png'],nil)' – iltempo

+0

@iltempo,不客氣。我已將您的示例添加到答案中。 – Jan

+1

這很棒,但沒有人提到你需要'需要'tmpdir'這個工作。 – KingBob

-2

我發現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 
+4

你用你需要「臨時文件」 需要「臨時文件」迪爾:: Tmpname.make_tmpname「/ tmp目錄/一滴」目錄:: Tempname ID,之前無 如果您還沒有加載「將它視爲」,那麼你不會能夠使用它的擴展Dir –

+0

@ScottThompson是的,謝謝。 – dinman2022