माणिक में पुनरावर्ती निर्देशिका कैसे बनाएँ?


101

मैं फ़ाइल को /a/b/c/d.txt के रूप में संग्रहीत करना चाहता हूं, लेकिन मुझे नहीं पता कि इनमें से कोई भी निर्देशिका मौजूद है और यदि आवश्यक हो तो उन्हें पुन: बनाने की आवश्यकता है। रूबी में यह कैसे किया जा सकता है?

जवाबों:


197

उपयोग करें mkdir_p:

FileUtils.mkdir_p '/a/b/c'

_pमाता-पिता / पथ आप भी अन्य नाम का उपयोग कर सकते हैं के लिए एक यूनिक्स पकड़ मिली है mkpath, तो यह है कि आप के लिए और अधिक समझ में आता है।

FileUtils.mkpath '/a/b/c'

रूबी में 1.9 FileUtils को कोर से हटा दिया गया था, इसलिए आपको करना होगा require 'fileutils'।


9
+1। FileUtilsऔर Pathnameशायद हैं रूबी शेल पटकथा लेखन के लिए सबसे महत्वपूर्ण उपकरण।
— जॉर्ग डब्ल्यू मित्तग

21

निर्देशिका को पुनरावर्ती बनाने के लिए mkdir_p का उपयोग करें

path = "/tmp/a/b/c"

FileUtils.mkdir_p(path) unless File.exists?(path)

5

यदि आप यूनिक्स मशीनों पर चल रहे हैं, तो यह मत भूलो कि आप हमेशा बैकलिक्स के नीचे एक खोल कमांड चला सकते हैं।

`mkdir -p /a/b/c`

इतना सकारात्मक होना हालांकि।
— मैथ्यू Schinckel

1
उप-प्रक्रिया में पॉपिंग सिस्टम कमांड सबसे अच्छा विचार नहीं है। रूबी मानक पुस्तकालय के साथ इसे करने के लिए त्रुटि से निपटने, परिणाम की जांच करना बेहतर है, आदि
— नॉटआराज


2

बचाव के लिए पथनाम !

Pathname('/a/b/c/d.txt').dirname.mkpath

यह स्वीकृत उत्तर की तुलना में कम सहज है। FileUtils ruby-doc.org/stdlib-2.6.5/libdoc/pathname/rdoc/… के
— नॉटआज

सवाल यह है: "मैं एक फ़ाइल को /a/b/c/d.txt के रूप में संग्रहीत करना चाहता हूं, लेकिन मुझे नहीं पता कि इनमें से कोई भी निर्देशिका मौजूद है"। मेरा समाधान मौजूदा फ़ाइल पथ ('/a/b/c/d.txt') का उपयोग करने की अनुमति देता है, और, अलग पार्सिंग के बिना, सभी फ़ोल्डर बनाएं।
— वडीम टायमिरोव

आपका मतलब है कि यह एक ही समय में FileUtils.mkdir_p '/a/b/c'बनाने + की अनुमति देता है d.txt?
— नोजज

नहीं, इसके बजाय यह अनुमति देता है Pathname('/a/b/c/d.txt').dirname.mkpathऔर File.write('/a/b/c/d.txt', content)बिना filename = '/a/b/c/d.txt'.rpartition('/').lastऔर बाकी के पार्सिंग
— वादिम टायमिरोव

0

आप अपने तर्क का भी उपयोग कर सकते हैं

def self.create_dir_if_not_exists(path)
  recursive = path.split('/')
  directory = ''
  recursive.each do |sub_directory|
    directory += sub_directory + '/'
    Dir.mkdir(directory) unless (File.directory? directory)
  end
end

इसलिए यदि पथ 'tmp / a / b / c' है यदि 'tmp' मौजूद नहीं है, तो 'tmp' निर्मित हो जाता है, तो 'tmp / a /' इत्यादि इत्यादि।


एक पहिए को फिर से लगाने से बचना होगा।
— नोजाज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.