अगर यह रूबी के साथ मौजूद नहीं है तो डायरेक्टरी बनाएं


156

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

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

हालाँकि, मुझे यह त्रुटि प्राप्त हो रही है:

ऐसी कोई फ़ाइल या निर्देशिका नहीं है - / उपयोगकर्ता / लुइगी / डेस्कटॉप / सर्वे_फाइनल / संग्रहीत / सर्वेक्षण / परीक्षण (इरनो :: ENENTENT)

यह निर्देशिका Dir.mkdirउपरोक्त कथन द्वारा क्यों नहीं बनाई जा रही है?


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

जवाबों:


263

आप शायद नेस्टेड निर्देशिका बनाने की कोशिश कर रहे हैं। यह मानते हुए 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, आप सिस्टम कॉल कर सकते हैं (@mu से अपडेट बहुत कम टिप्पणी है):

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

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


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

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

1
@muistooshort @ zrl3dx systemकॉल fileutilsफिर से कैसे बेहतर है ? मैं विंडोज पर हूं और mkdir_pबिना ठीक-ठीक अंकुश लगाए सिर्फ पार्स करने के लिए काम करता हूं mkdir -pजो वैसे भी विफल हो जाएगा। खुशी है कि fileutilsजवाब में पहला विकल्प है।
ट्वीस्टरेब

1
@TWiStErRob: मेरी टिप्पणियों को फिर से पढ़ें, मैंने कहा कि इसके बारे में कुछ नहीं fileutilsया mkdir_p, मैं जो system command, arg1, arg2, ...कुछ कह रहा हूं, वह इससे बेहतर है system command_with_arguments
म्यू बहुत छोटा है

3
@ muistooshort आह, क्षमा करें, तो आप बस कह रहे हैं कि बुरा विकल्प करने का एक बेहतर तरीका है :)
TWiStErRob

71

सरल तरीका:

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

8
एक File.directory का उपयोग करेगा? File.exists के बजाय?
फ्लोरिन असावोई

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

3
यह एक दौड़ की स्थिति भी बनाता है। फ़ाइल जाँच के बाद लेकिन निर्माण से पहले बनाई जा सकती है।
डॉन रेबा

25

एक और सरल तरीका:

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


यदि आप नेस्टेड निर्देशिका बनाना चाहते हैं तो यह काम नहीं करता है। उदाहरण के लिए, मैं निम्नलिखित निर्देशिका बनाना चाहता था, /home/jignesh/reports/testलेकिन इस समाधान को उठाया RUBY (Errno::ENOENT), no such file or directory @ dir_s_mkdir। तो विश्वसनीय समाधान का उपयोग कर रहा हैFileUtils.mkdir_p
जिग्नेश गोहेल

-5

कैसे बस के बारे में Dir.mkdir('dir') rescue nil?


3
rescueइसके संशोधक रूप में उपयोग करने से बचें ।
सेबस्टियन पाल्मा

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


1
मैंने पहले ही किया था, और मैं पूरी तरह से असहमत हूं, मुझे लगता है कि यह मूर्खतापूर्ण है, इसलिए शायद आप मुझे बता सकते हैं?
विदर्भ

6
यह किसी भी अपवाद को पकड़ लेता है जो ऐसा नहीं है जिसे आप करने की कोशिश कर रहे हैं और एक वास्तविक दुनिया ऐप में रखरखाव को कठिन बनाने वाली समस्याओं को छिपाएगा। इसके अलावा, इसके अपवाद के रूप में सशर्त के रूप में उपयोग करने के लिए एक महान विचार नहीं है, एक हार्डवेयर अर्थ में वे बहुत धीमी गति से चलते हैं (संभवतः एक आधुनिक भाषा में एक मुद्दा नहीं है लेकिन फिर भी आप एक कोडर के रूप में अनुभवहीन हैं)।
Ed_
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.