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


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.