2012-12-09 20 views
28

Tempfile Ruby kullanırken, iş parçacığı güvenli ve süreçler arası güvenli bir ada sahip bir dosya oluşturulur. Sadece bu şekilde bir dosya adına ihtiyacım var.Bir iş parçacığı için güvenli geçici dosya adı oluşturma

daha yalındır yaklaşım yolu olup olmadığını merak ediyorum: Eğer TempfileDir::Tmpname içerdiğini fark edeceksiniz tempfile.rb yılında Kazı

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

cevap

51

. İçinde, ne istediğini yapar make_tmpname bulacaksınız. Aynı dosyada

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" 

da ulaşmak istediğiniz şeye bağlı olarak biraz daha make_tmpname daha yapar Dir::Tmpname.create var. Özellikle, hangi geçici dizinin kullanılacağını anlar ( /tmp'un global olarak doğru bir varsayım olduğu yerde * olmadığınızı varsayarak).

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

blok kodu dosya varsa test etmek ve yeni bir isim değeri üzerinde etiketlenmiş artırılmıyor ile oluşturulabilir, böylece bir Errno::EEXIST yükseltmek için vardır: Yine de, biraz çirkin bir blok beklediğini verilen kullanmak için son.

+0

Teşekkürler, işte bu kadar. Dosya adı uzantısını korumak için bir dizi argümanı ile de kullanılabilir: 'Dir :: Tmpname.make_tmpname (['a', '.png'], nil)' – iltempo

+0

@iltempo, rica ederim. Örneğini cevaba ekledim. – Jan

+1

Bu harika ama kimse bunun için 'tmpdir' gerektirmesi gerektiğini söylemedi. Eğer 'tempfile' yüklü etmediyseniz nil sen 'tempfile' 'tempfile' Dir :: Tmpname.make_tmpname "/ tmp/blob" gerektiren gerektiren Dir :: Tempname id, kullanılan önce – KingBob

-2

Yönü buldum: Tmpname çözümü benim için çalışmadı. Bu değerlendirirken: MRG Ruby Altında

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

1.9.3p194 alıyorum:

uninitialized constant Dir::Tmpname (NameError) 

JRuby 1.7.5 altında (1.9.3p393) alıyorum:

NameError: uninitialized constant Dir::Tmpname 

Sen deneyebilirsiniz Böyle bir şey:

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

o zaman olmaz Bu uzantıları Direkt –

+0

@ScottThompson'a kullanabilir, teşekkürler. – dinman2022

İlgili konular