अगर एक निर्देशिका / फ़ाइल / सिमलिंक रूबी में एक कमांड के साथ मौजूद है, तो कैसे जांचें


83

अगर निर्देशिका / फ़ाइल / सिमलिंक / आदि का पता लगाने का एक ही तरीका है। संस्था (अधिक सामान्यीकृत) मौजूद है?

मुझे एक एकल फ़ंक्शन की आवश्यकता है क्योंकि मुझे पथों की एक सरणी की जांच करने की आवश्यकता है जो निर्देशिकाओं, फ़ाइलों या सीमलिंक हो सकते हैं। मुझे पता है कि File.exists?"file_path"निर्देशिका और फ़ाइलों के लिए काम करता है, लेकिन सिम्बलिंक (जो है File.symlink?"symlink_path") के लिए नहीं।


1
रूबी आप किस संस्करण का उपयोग कर रहे हैं? फाइल मौजूद है? रूबी में मेरे लिए सहानुभूति के लिए काम करता है 1.9.2 OS X 10.6.6 में

1
स्पष्ट करने के लिए: सीमलिंक के लिए, आप कुछ माँग रहे हैं जो कि trueअगर सिमिलिंक मौजूद है, तो इसकी परवाह किए बिना कि क्या वह अंततः एक गैर-सिमलिंक के लिए हल हो सकता है। यानी इसे trueटूटे हुए लिंक के लिए भी लौटना चाहिए । File.exists?केवल trueएक सिम्लिंक के लिए वापस आ जाएगा जो टूटा नहीं है।
केल्विन

जवाबों:


147

मानक फ़ाइल मॉड्यूल में सामान्य फ़ाइल परीक्षण उपलब्ध हैं:

RUBY_VERSION # => "1.9.2"
bashrc = ENV['HOME'] + '/.bashrc'
File.exist?(bashrc) # => true
File.file?(bashrc)  # => true
File.directory?(bashrc) # => false

आपको वहां जो चाहिए, वह आपको मिल जाना चाहिए।


ओपी: "धन्यवाद लेकिन मुझे तीनों सही या गलत चाहिए

बेशक नहीं। ठीक है, कुछ इस तरह की कोशिश करो:

def file_dir_or_symlink_exists?(path_to_file)
  File.exist?(path_to_file) || File.symlink?(path_to_file)
end

file_dir_or_symlink_exists?(bashrc)                            # => true
file_dir_or_symlink_exists?('/Users')                          # => true
file_dir_or_symlink_exists?('/usr/bin/ruby')                   # => true
file_dir_or_symlink_exists?('some/bogus/path/to/a/black/hole') # => false

1
मैं कच्चे स्ट्रिंग संघटन ( ENV['HOME'] + '/.bashrc') करने के खिलाफ सलाह दूंगा जो क्रॉस-प्लेटफॉर्म पर काम नहीं कर सकता है। आपको रूबी फाइल जॉइन का उपयोग करना चाहिए और यह भी कि Rails.rootयदि आप रेल का उपयोग कर रहे हैं तो क्यों नहीं । File.exists?(Rails.root.join('db', 'my_seeds.csv')
सिरिल डचोन-डोरिस

2
यह क्रॉस-प्लेटफ़ॉर्म पर काम नहीं करने की गारंटी है क्योंकि विंडोज बैश के बारे में नहीं जानता है, और इसलिए, .bashrc के बारे में। लेकिन यह एक * nix- आधारित प्लेटफॉर्म पर काम करेगा। /हालांकि इस मुद्दे का उपयोग नहीं हुआ है, क्योंकि रूबी के आईओ स्वचालित रूप से विंडोज पर आगे के स्लैश से बैक स्लैश में परिवर्तित हो जाते हैं
टीन मैन

हो सकता है कि दिसंबर 2016 में सच था कि, लेकिन Windows निश्चित रूप से करता है इन दिनों बैश के बारे में पता है। :-) मैं bashप्रारंभ मेनू में टाइप कर सकता हूं , और परिणामी कंसोल विंडो में, cat ~/.bashrcआउटपुट उत्पन्न करता हूं । ¯ \ _ (ツ) _ / ¯
जोनाथन गिल्बर्ट

सिरिल का जवाब दुर्भाग्य से पूरी तरह से सही नहीं है - "फाइल.एक्सिस्ट" के लिए विंडोज़ पर स्ट्रिंग कंसट्रक्शन काम नहीं करता है? चेक, जैसा कि टिन मैन ने पहले ही बताया था। मैंने इसकी पुष्टि करने के लिए केवल इस टिप्पणी को यहां जोड़ा है।
शेवी

14

क्यों अपने स्वयं के कार्य को परिभाषित नहीं करते हैं File.exists?(path) or File.symlink?(path)और इसका उपयोग करते हैं?


2
@Clawsy मुझे लगता है कि आप Gintautas की बात याद कर रहे हैं: आप एक प्रोग्रामर हैं - यदि आपके द्वारा आवश्यक फ़ंक्शन मौजूद नहीं है, तो आप इसे बना सकते हैं।
टेलीमेकस

4
जब यह पहले से ही भाषा का हिस्सा है तो पहिए को क्यों मजबूत किया जाए?
टिन मैन

11
मुझे यह बहुत उपयोगी लगता है कि प्रोग्रामिंग में बहुत अधिक विस्तार के बारे में ध्यान न दें। यदि आप किसी समस्या को हल करने का सीधा और सरल तरीका जानते हैं, तो बस करें। यदि आपको कुछ समय बाद एक बेहतर तरीका मिल जाता है, तो आप हमेशा वापस जा सकते हैं और ठीक कर सकते हैं। एक नए कार्य को परिभाषित करना इस स्थिति में एक नो-ब्रेनर है।
गिन्नुतस मिलियायुस्कस

5
लेकिन, कार्यक्षमता पहले से ही भाषा में निर्मित है और उपयोग करने के लिए सरल है। यह तब देखने के लिए पढ़ने का मामला बन जाता है कि क्या उपलब्ध है और कॉल को जोड़ना है। कार्यक्षमता को लागू करने के लिए कोड लिखना जो पहले से ही मौजूद है क्योंकि आपने भाषा के साथ आने वाले RDoc को पढ़ने के लिए समय नहीं लिया है ... बस मुझे इसमें शामिल नहीं किया गया है। उस तर्क से आप मानक पुस्तकालय को फिर से लिख सकते हैं।
द टीन मैन

2
File.exist का उपयोग करें? File.exists के बजाय? : इस गहरे लाल रंग का 2.2.0 में हटा दिया गया है के रूप में ruby-doc.org/core-2.2.0/File.html#method-c-exists-3F
ATW
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.