2013-10-09 28 views
109

मैं निम्नलिखित कोड के साथ एक निर्देशिका बनाने के लिए कोशिश कर रहा हूँ के साथ मौजूद नहीं है:निर्देशिका बनाने अगर यह रूबी

No such file or directory - /Users/Luigi/Desktop/Survey_Final/Archived/Survey/test (Errno::ENOENT)

क्यों है:

Dir.mkdir("/Users/Luigi/Desktop/Survey_Final/Archived/Survey/test") 
    unless File.exists?("/Users/Luigi/Desktop/Survey_Final/Archived/Survey/test") 

हालांकि, मैं इस त्रुटि प्राप्त कर रहा हूँ यह निर्देशिका उपरोक्त Dir.mkdir कथन द्वारा नहीं बनाई जा रही है?

+4

'File.exists()' फ़ाइलों और फ़ोल्डरों पर काम करता है। यह अंतर नहीं जानता है। –

उत्तर

182

आप शायद नेस्टेड निर्देशिका बनाने की कोशिश कर रहे हैं। मान लिया जाये कि foo मौजूद नहीं है, आप के लिए no such file or directory त्रुटि प्राप्त होगा:

Dir.mkdir 'foo/bar' 
# => Errno::ENOENT: No such file or directory - 'foo/bar' 

एक ही बार में नेस्टेड निर्देशिका बनाने के लिए, FileUtils की जरूरत है:

require 'fileutils' 
FileUtils::mkdir_p 'foo/bar' 
# => ["foo/bar"] 

EDIT2: आप FileUtils उपयोग करने के लिए नहीं है, आप कर सकते हैं सिस्टम कॉल करें (@ एमयू से अपडेट बहुत कम टिप्पणी है):

> system 'mkdir', '-p', 'foo/bar' # worse version: system 'mkdir -p "foo/bar"' 
=> true 

लेकिन ऐसा लगता है (कम से कम मेरे लिए) बदतर दृष्टिकोण के रूप में आप बाहरी 'टूल' का उपयोग कर रहे हैं जो कुछ सिस्टमों पर अनुपलब्ध हो सकता है (हालांकि मैं शायद mkdir के बिना सिस्टम की कल्पना कर सकता हूं, लेकिन कौन जानता है)।

+5

'system 'mkdir', '-p', 'foo/bar'' उस' सिस्टम 'कॉल का बेहतर संस्करण होगा। एक अतिरिक्त खोल प्रक्रिया या सामान्य उद्धरण/भागने/इंजेक्शन बकवास की आवश्यकता नहीं है जो 'system' के एकल तर्क संस्करण के साथ आता है। –

+0

धन्यवाद, यह नहीं पता था, अतिरिक्त खोल प्रक्रिया से आपका क्या मतलब है? – zrl3dx

+6

'system'' mkdir -p "foo/bar" स्ट्रिंग को पार्स करने के लिए '/ bin/sh' लॉन्च करेगा और फिर खोल'/bin/mkdir' चलाएगा। तो आप अतिरिक्त काम कर रहे हैं (कमांड स्ट्रिंग बनाएं, इसे फिर से खींचने के लिए '/ bin/sh' लॉन्च करें) और उस अतिरिक्त कार्य में से कुछ आपको खोल इंजेक्शन हमलों के लिए खोलते हैं (रुबी के लिए सीईआरटी सलाहकारों में कुछ समय बिताएं और आप देखेंगे कि यह समस्या कितनी आम है)। –

54

सरल तरीका:

के बारे में कैसे
directory_name = "name" 
Dir.mkdir(directory_name) unless File.exists?(directory_name) 
+7

कोई फ़ाइल निर्देशिका का उपयोग करेगा? File.exists के बजाय? –

+4

मान लीजिए कि एक ही नाम के साथ एक सामान्य फ़ाइल है। आप इस तरह के मामले में एक निर्देशिका नहीं बना सका। –

+2

यह भी दौड़ की स्थिति बनाता है। फ़ाइल चेक के बाद बनाई जा सकती है लेकिन सृजन से पहले। –

0

सिर्फ Dir.mkdir('dir') rescue nil?

+2

अपने संशोधक रूप में 'बचाव' का उपयोग करने से बचें। –

+1

यह बताने की देखभाल कि मुझे केवल 1 की बजाय कोड की 5 लाइन क्यों लिखनी चाहिए? मैं आपको कोशिश करना चाहता हूं। – Vidar

+1

https://github.com/bbatsov/ruby-style-guide#no-rescue-modifiers एक नज़र है, कृपया –

4

एक और आसान तरीका:

Dir.mkdir('tmp/excel') unless Dir.exist?('tmp/excel')

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