2012-12-09 12 views
28

Tempfile का उपयोग करते समय रूबी थ्रेड-सुरक्षित और अंतर-प्रक्रिया-सुरक्षित नाम वाली फ़ाइल बना रहा है। मुझे उस तरह से केवल एक फ़ाइल नाम की आवश्यकता है।थ्रेड-सुरक्षित अस्थायी फ़ाइल नाम बनाना

अगर वहाँ की तुलना में अधिक सीधे आगे दृष्टिकोण तरीका है मैं सोच रहा था:

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

उत्तर

51

tempfile.rb में खुदाई आप ध्यान देंगे कि TempfileDir::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 से है। विशेष रूप से, यह पता लगाता है कि किस अस्थायी निर्देशिका का उपयोग करना है (मान लीजिए कि आप * निक्स पर नहीं हैं जहां /tmp एक वैश्विक रूप से सही धारणा है)। फिर भी, यह देखते हुए का उपयोग करने के लिए एक छोटे से बदसूरत है कि यह एक ब्लॉक की उम्मीद:

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

ब्लॉक वहाँ है यदि फ़ाइल मौजूद कोड का परीक्षण और यह एक नए नाम के साथ incrementing मूल्य पर टैग उत्पन्न किया जा सकता है ताकि एक 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 

एमआरआई रूबी के तहत 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

इससे पहले कि आप डिर :: Tempname आईडी आप 'tempfile' 'tempfile' डिर :: Tmpname.make_tmpname "/ tmp/ब्लॉब" की आवश्यकता होती है की आवश्यकता होती है, का इस्तेमाल किया शून्य आप 'tempfile' लोड नहीं किया है तो आप ऐसा नहीं करेंगे Dir –

+0

@ScottThompson हां, के लिए इसके एक्सटेंशन का उपयोग करने में सक्षम हो। – dinman2022

संबंधित मुद्दे