अगर रूबी में फाइल क्लास का उपयोग करने वाला कोई मौजूद नहीं है तो मैं डायरेक्टरी कैसे बनाऊं?


121

मेरा यह कथन है:

File.open(some_path, 'w+') { |f| f.write(builder.to_html)  }

कहाँ पे

some_path = "somedir/some_subdir/some-file.html"

क्या मैं ऐसा करना चाहते हैं, अगर कोई निर्देशिका कहा जाता है somedirया some_subdirया रास्ते में दोनों, मैं इसे पूर्ण रूप से अपने यह बनाना चाहते हैं।

मैं उसे कैसे कर सकता हूँ?

जवाबों:


154

यदि आप पहले से मौजूद नहीं हैं, तो आप मूल निर्देशिका बनाने के लिए FileUtils का उपयोग कर सकते हैं:

require 'fileutils'

dirname = File.dirname(some_path)
unless File.directory?(dirname)
  FileUtils.mkdir_p(dirname)
end

संपादित करें: यहां केवल कोर पुस्तकालयों का उपयोग करके एक समाधान है (पहिया को फिर से लागू करना, अनुशंसित नहीं है)

dirname = File.dirname(some_path)
tokens = dirname.split(/[\/\\]/) # don't forget the backslash for Windows! And to escape both "\" and "/"

1.upto(tokens.size) do |n|
  dir = tokens[0...n]
  Dir.mkdir(dir) unless Dir.exist?(dir)
end


ओह ठीक। मेरा मतलब कोर था, स्टैडलिब नहीं। किसी भी तरह से, यह ठीक है। यह काम। धन्यवाद!
marcamillion

1
मैंने अपने उत्तर के लिए एक कोर-ओनली सॉल्यूशन जोड़ा: जागरूक रहें, हालांकि, यह अनिवार्य रूप से पुन: लागू होता है FileUtils.mkdir_p(जो कि आपके उपयोग के मामले में समर्पित विधि है)
यूरेका

57
ध्यान दें कि FileUtils#mkdir_pभले ही निर्देशिका पदानुक्रम पहले से ही मौजूद है (यह सिर्फ कुछ भी नहीं करता है) इसलिए यह समाधान एक-लाइनर प्लस एक आवश्यकता बयान में संकुचित हो सकता है:FileUtils.mkdir_p(File.dirname(some_path))
यूरेका

1
@ जोसेफ - मेरे लिए यह (भ्रामक) EEXIST त्रुटि एक अनुमति मुद्दा होने के कारण समाप्त हो गई।
टॉम

81

एक निर्देशिका बनाने का तरीका ढूंढने वालों के लिए यदि यह मौजूद नहीं है , तो इसका सरल उपाय है:

require 'fileutils'

FileUtils.mkdir_p 'dir_name'

यूरेका की टिप्पणी के आधार पर ।


1
यह @ यूरेका की टिप्पणी है - "ध्यान दें कि FileUtils # mkdir_p काम करता है, भले ही निर्देशिका पदानुक्रम पहले से मौजूद हो (यह सिर्फ कुछ भी नहीं करता है) इसलिए यह समाधान एक-लाइनर प्लस एक आवश्यकता बयान में संकुचित किया जा सकता है FileUtils.mkdir_p(File.dirname(some_path))"
डारपॉन

23
directory_name = "name"
Dir.mkdir(directory_name) unless File.exists?(directory_name)

2
आप इस पद्धति का उपयोग करके दौड़ की स्थिति में दौड़ सकते हैं, फ़ाइल.एक्सिस्ट के बाद निर्देशिका बनाई जा सकती है? चलता है, लेकिन इससे पहले Dir.mkdir निष्पादित किया जाता है।
मैट फेनेलन

4

दूसरों के जवाबों के आधार पर, कुछ भी नहीं हुआ (काम नहीं किया)। कोई त्रुटि नहीं थी, और कोई निर्देशिका नहीं बनाई गई थी।

यहाँ मुझे क्या करना है:

require 'fileutils'
response = FileUtils.mkdir_p('dir_name')

मुझे उस प्रतिक्रिया को पकड़ने के लिए एक चर बनाने की ज़रूरत थी जो FileUtils.mkdir_p('dir_name')वापस भेजती है ... तो सब कुछ एक आकर्षण की तरह काम करता था!


कोई मतलब नहीं है। आपको रिटर्न को पकड़ने की आवश्यकता क्यों है?
टिम क्रॉश्चर

@ ह्वेनसन, मुझे रिटर्न पकड़ने की ज़रूरत नहीं थी ... लेकिन तर्क तब तक काम नहीं करता था जब तक मैं नहीं बना response = FileUtils.mkdir_p('dir_name')। अगर मैंने यह चर नहीं बनाया, तो FileUtils.mkdir_p('dir_name')मेरे लिए काम नहीं कर रहा था ... या कम से कम मुझे याद है कि यह हुआ (यह उत्तर 1 वर्ष से अधिक पुराना है)। मुझे आश्चर्य नहीं होगा अगर रूबी का एक नया संस्करण इस मुद्दे को ठीक करता है।
skplunkerin

2

कैसे उपयोग करने के बारे में Pathname?

require 'pathname'
some_path = Pathname("somedir/some_subdir/some-file.html")
some_path.dirname.mkdir_p
some_path.write(builder.to_html)

1
यह some_path.dirname.mkpathइसके बजाय काम करता हैsome_path.dirname.mkdir_p
मौरो निडोला

1
+1 पर mkpath। इसके अलावा अगर आपके पास सिर्फ निर्देशिका है और पथ नहीं है, तो इसके लिए कोई आवश्यकता नहीं है dirname, जैसे Pathname ("somedir / some_subdir")। mkpath उसी तरह काम करेगा।
माइकल

1

इसी तरह की लाइनों के साथ (और आपकी संरचना के आधार पर), यह है कि हमने स्क्रीनशॉट को स्टोर करने के लिए कहां हल किया है:

हमारे एनवी सेटअप (env.rb) में

screenshotfolder = "./screenshots/#{Time.new.strftime("%Y%m%d%H%M%S")}"
unless File.directory?(screenshotfolder)
  FileUtils.mkdir_p(screenshotfolder)
end
Before do
  @screenshotfolder = screenshotfolder
  ...
end

और हमारे हुकरेब में

  screenshotName = "#{@screenshotfolder}/failed-#{scenario_object.title.gsub(/\s+/,"_")}-#{Time.new.strftime("%Y%m%d%H%M%S")}_screenshot.png";
  @browser.take_screenshot(screenshotName) if scenario.failed?

  embed(screenshotName, "image/png", "SCREENSHOT") if scenario.failed?

1

शीर्ष उत्तर "कोर लाइब्रेरी" केवल समाधान अधूरा था। यदि आप केवल मुख्य पुस्तकालयों का उपयोग करना चाहते हैं, तो निम्नलिखित का उपयोग करें:

target_dir = ""

Dir.glob("/#{File.join("**", "path/to/parent_of_some_dir")}") do |folder|
  target_dir = "#{File.expand_path(folder)}/somedir/some_subdir/"
end

# Splits name into pieces
tokens = target_dir.split(/\//)

# Start at '/'
new_dir = '/'

# Iterate over array of directory names
1.upto(tokens.size - 1) do |n|

  # Builds directory path one folder at a time from top to bottom
  unless n == (tokens.size - 1)
    new_dir << "#{tokens[n].to_s}/" # All folders except innermost folder
  else
    new_dir << "#{tokens[n].to_s}" # Innermost folder
  end

  # Creates directory as long as it doesn't already exist
  Dir.mkdir(new_dir) unless Dir.exist?(new_dir)
end

मुझे इस समाधान की आवश्यकता थी क्योंकि FileUtils की निर्भरता रत्न rmagick ने मेरे रेल एप्लिकेशन को Amazon वेब सेवाओं पर तैनात होने से रोक दिया था क्योंकि rmagick पैकेज libmagickwand-dev (Ubuntu) / imagemagick (OSX) पर ठीक से काम करने के लिए निर्भर करता है।

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