घर निर्देशिका के सापेक्ष फ़ाइलें कैसे खोलें


95

निम्न के साथ विफल रहता है Errno::ENOENT: No such file or directory, भले ही फ़ाइल मौजूद हो:

open('~/some_file')

हालाँकि, मैं यह कर सकता हूँ:

open(File.expand_path('~/some_file'))

मेरे दो सवाल हैं:

  1. openहोम निर्देशिका की ओर इशारा करते हुए टिल्ड को संसाधित क्यों नहीं किया जाता है?
  2. वहाँ से एक चालाक रास्ता है File.expand_path?

जवाबों:


109
  1. शेल (बाश, zsh, आदि) वाइल्डकार्ड विस्तार के लिए जिम्मेदार है, इसलिए आपके पहले उदाहरण में कोई शेल नहीं है, इसलिए कोई विस्तार नहीं है। को इंगित करने के लिए टिल्ड का उपयोग करना $HOMEएक मात्र सम्मेलन है; वास्तव में, यदि आप File.expand_pathइसके लिए प्रलेखन को देखते हैं , तो यह सही ढंग से टिल्ड की व्याख्या करता है, लेकिन यह फ़ंक्शन की एक विशेषता है, न कि अंतर्निहित प्रणाली के लिए अंतर्निहित कुछ; इसके अलावा, पर्यावरण चर को सही ढंग से सेट करने की File.expand_pathआवश्यकता है $HOME। जो हमें संभावित विकल्प के लिए लाते हैं ...
  2. इसे इस्तेमाल करे:

    open(ENV['HOME']+'/some_file')

मुझे उम्मीद है कि यह काफी चालाक है। मैं व्यक्तिगत रूप से सोचता हूं कि पर्यावरण चर का उपयोग करना शब्दार्थ से अधिक स्पष्ट है expand_path


विंडोज़ का उपयोग .. करना पड़ाopen(ENV['HOME']+'some_file')
डेविड वेस्ट

9
File.join(ENV['HOME'], '/some_file')दोनों मामलों में काम करने के लिए बस का उपयोग करें ।
मार्सिन बिल्स्की

123

सुनिश्चित नहीं है कि यह रूबी 1.9.3 से पहले उपलब्ध था, लेकिन मुझे पता है कि सबसे सुरुचिपूर्ण समाधान का उपयोग करना है Dir.homeजो कोर का हिस्सा है।

open("#{Dir.home}/some_file")

2
नहीं, 1.9.3 ( apidock.com/ruby/v1_9_2_180/Dir/home/class ) से नीचे के उपयोगकर्ताओं के लिए उपलब्ध नहीं है ।
इयान वघन

12

$HOMEसही तरीके से सेट किए जा रहे पर्यावरण चर पर भरोसा करने के बजाय , जो विकास के लिए साझा नेटवर्क कंप्यूटर का उपयोग करते समय एक परेशानी हो सकती है, आप रूबी का उपयोग करके इसे प्राप्त कर सकते हैं:

require 'etc'
open ("#{Etc.getpwuid.dir}/some_file")

मेरा मानना ​​है कि यह वर्तमान लॉग-इन उपयोगकर्ता की पहचान करता है और वैश्विक $HOMEवातावरण चर पर निर्भर होने के बजाय उनके घर निर्देशिका प्राप्त करता है । यह उपरोक्त I रेकॉन का एक वैकल्पिक समाधान है।


2

मुझे टिल्ड की समस्या का पता चला, और एक पैच बनाया गया absolute_path जो कि टिल्ड को एक साधारण चरित्र के रूप में मानता है।

फ़ाइल दस्तावेज़ से:

absolute_path(file_name [, dir_string] )  abs_file_name

एक पथनाम को एक पूर्ण पथनाम में परिवर्तित करता है। जब तक dir_string नहीं दिया जाता है, तब तक संबंधित पथ को प्रक्रिया की वर्तमान कार्यशील निर्देशिका से संदर्भित किया जाता है, इस स्थिति में इसका उपयोग प्रारंभिक बिंदु के रूप में किया जाएगा। यदि दिए गए pathname एक "~" से शुरू होता है, तो इसका विस्तार नहीं किया जाता है, इसे सामान्य निर्देशिका नाम के रूप में माना जाता है।

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