2012-12-09 8 views
28

Tempfile을 사용하는 경우 Ruby는 스레드로부터 안전하고 프로세스 간 안전한 이름으로 파일을 만듭니다. 그런 식으로 파일 이름 만 있으면됩니다.스레드 안전 임시 파일 이름 만들기

보다 더 똑바로 앞으로 접근 방법이 있는지 궁금 해서요 : 당신이 TempfileDir::Tmpname를 포함하는 것을 알 수 있습니다 tempfile.rb에 파고

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

답변

51

가. 안에는 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" 

는 또한 당신이 달성하고자하는 내용에 따라, 좀 더 make_tmpname보다 않는, Dir::Tmpname.create있다. 특히, 어떤 임시 디렉토리를 사용할지를 결정합니다 (여기서 /tmp은 * nix가 아니라는 전제하에 가정합니다).

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'을 요구해야한다고 언급하지 않았습니다. 당신이 '임시 파일'을로드하지 않은 경우 전무는 '임시 파일' 이 '임시 파일'디렉터리 : Tmpname.make_tmpname "/ tmp를/덩어리"를 요구를 필요로 디렉터리 :: Tempname ID를 사용하기 전에 – KingBob

-2

Dir : Tmpname 솔루션이 나에게 적합하지 않음을 알았습니다. 이 평가할 때 : MRI 루비에서

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

는 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

당신은하지 않습니다 Dir의 확장 기능을 사용할 수 있습니다. –

+0

@ScottThompson 네, 고마워요. – dinman2022