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


163

मैं एक स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो एक निर्दिष्ट निर्देशिका मौजूद है या नहीं इसके आधार पर एक तोड़फोड़ यूआरएल को स्वचालित रूप से जांचता है या अपडेट करता है।

किसी कारण से, मेरा कोड काम नहीं कर रहा है और हमेशा गलत होने पर भी सही रिटर्न देता है :

def directory_exists?(directory)
  return false if Dir[directory] == nil
  true
end

मैं क्या गलत कर रहा हूं?

जवाबों:


287

यदि यह मायने रखता है कि आप जिस फ़ाइल की तलाश कर रहे हैं वह एक निर्देशिका है और केवल एक फ़ाइल नहीं है, तो आप उपयोग कर सकते हैं File.directory?या कर सकते हैंDir.exist? । यह तभी सही होगा जब फ़ाइल मौजूद है और निर्देशिका है।

एक तरफ के रूप में, विधि लिखने के लिए एक और अधिक मुहावरेदार तरीका इस तथ्य का लाभ उठाना होगा कि रूबी स्वचालित रूप से विधि के अंदर अंतिम अभिव्यक्ति का परिणाम लौटाती है। इस प्रकार, आप इसे इस तरह लिख सकते हैं:

def directory_exists?(directory)
  File.directory?(directory)
end

ध्यान दें कि वर्तमान स्थिति में विधि का उपयोग करना आवश्यक नहीं है।


139
इसे दूसरे तरीके के अंदर डालने की भी जहमत क्यों? बस सीधे फोन करो!
रयान बिग

11
@ रदर मैं लगा कि छीन-छँट विधि को प्रश्न के उद्देश्य के लिए सरल किया गया था और वास्तविक विधि में कुछ अतिरिक्त तर्क हो सकते हैं। यदि किसी अन्य तर्क को विधि में जाने की आवश्यकता नहीं है, तो मैं सहमत हूं। हर तरह से, बस निर्देशिका चला? सीधे।
एमिली

4
की Dir.exists?तुलना में क्लीनर नहीं होगा File.directory??
यो लुडके

3
Dir.exists?पदावनत किया जाता है, का उपयोग करेंDir.exist
fcoessler

4
@ Dir.exist?
नाराज़गी

42

आप भी इस Dir::exist?तरह का उपयोग कर सकते हैं :

Dir.exist?('Directory Name')

trueयदि 'निर्देशिका का नाम' एक निर्देशिका है, तो वापस लौटाता है false1


2
ऐसा लगता है कि रूबी> 1.9 या तो की आवश्यकता है, 1.8 पर यह रिटर्न देता है undefined method `exists?' for Dir:Class (NoMethodError)। इसके अलावा, बहुवचन रूप अब पदावनत है, .exist?इसके बजाय उपयोग करें ।
जोसिप रॉडिन

40

अन्य सभी उत्तर सही हैं, हालाँकि, यदि आपके पास किसी उपयोगकर्ता के होम डायरेक्टरी में डायरेक्टरी को चेक करने की कोशिश कर रहे हैं तो आपको समस्या हो सकती है। जाँच से पहले सुनिश्चित करें कि आप सापेक्ष पथ का विस्तार कर रहे हैं:

File.exists? '~/exists'
=> false
File.directory? '~/exists'
=> false
File.exists? File.expand_path('~/exists')
=> true

18
File.exist?("directory")

Dir[]एक सरणी देता है, इसलिए यह कभी नहीं होगा nil। यदि आप इसे अपने तरीके से करना चाहते हैं, तो आप कर सकते हैं

Dir["directory"].empty?

trueअगर यह नहीं मिला तो वापस आ जाएगा ।


7

आप उपयोग कर सकते हैं Kernel#test:

test ?d, 'some directory'

यह इसकी उत्पत्ति https://ss64.com/bash/test.html से हुई है। यदि कोई निर्देशिका मौजूद है तो आपको यह पता चलेगा testकि इस झंडे -dका परीक्षण किया जाएगा-d file True if file is a Directory. [[ -d demofile ]]


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