2012-12-09 18 views
28

Podczas korzystania z Tempfile Ruby tworzy plik z nazwą bezpieczną dla wątków i bezpieczną między procesami. W ten sposób potrzebuję tylko nazwy pliku.Tworzenie tymczasowej nazwy pliku tymczasowego

Zastanawiałem się, czy istnieje bardziej proste podejście do przodu sposób niż:

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

Odpowiedz

51

Kopanie w tempfile.rb zauważysz, że Tempfile obejmuje Dir::Tmpname. Wewnątrz znajdziesz make_tmpname, który spełnia Twoje oczekiwania.

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" 

w tym samym pliku, istnieje również Dir::Tmpname.create które, w zależności od tego, co chcesz osiągnąć, robi się trochę bardziej niż make_tmpname. W szczególności określa, z jakiego katalogu tymczasowego należy korzystać (zakładając, że nie jesteś na * nix, gdzie /tmp jest poprawnym globalnie założeniem). Mimo to, trochę brzydka wykorzystują zważywszy, że spodziewa się blok:

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

blok jest tam kod, aby sprawdzić, czy plik istnieje i podnieść Errno::EEXIST tak, że nowa nazwa może być generowane z zwiększając wartość oznaczone na koniec.

+0

Dzięki, to wszystko. Może być również używany z argumentem tablicowym, aby zachować rozszerzenie nazwy pliku: 'Dir :: Tmpname.make_tmpname (['a', '.png'], zero)' – iltempo

+0

@iltempo, nie ma za co. Dodałem twój przykład do odpowiedzi. – Jan

+1

To jest świetne, ale nikt nie wspomniał, że musisz "wymagać" tmpdir'', aby to działało. – KingBob

-2

Znalazłem rozwiązanie Dir: Tmpname nie działa dla mnie. Przy ocenie to:

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

Pod MRI Ruby 1.9.3p194 uzyskać:

uninitialized constant Dir::Tmpname (NameError) 

Pod JRuby 1.7.5 (1.9.3p393) uzyskać:

NameError: uninitialized constant Dir::Tmpname 

Można spróbować coś takiego:

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

Przed wykorzystywane Dir :: Tempname id ty require 'pliku tymczasowego' require 'tempfile' Dir :: Tmpname.make_tmpname "/ tmp/blob" Nil Jeśli nie ładowane 'tempfile' wtedy nie będzie móc korzystać z rozszerzeń Dir –

+0

@ScottThompson Tak, dziękuję. – dinman2022

Powiązane problemy