2013-09-24 5 views
6

मान लीजिए कि एक स्क्रिप्ट को एक निर्देशिका को एक्सेस करने की आवश्यकता है, /some/where/abc "मनमानी" ओएस पर कहें। कुछ विकल्प रूबी में पथ निर्माण करने के लिए कर रहे हैं: मानक एपीआई रुबी में पोर्टेबल पूर्ण पथ कैसे बनाएं?

में

  • File.join('', 'some', 'where', 'abc')
  • File.absolute_path("some#{File::SEPARATOR}where#{File::SEPARATOR}abc", File::SEPARATOR)
  • Pathname मेरा मानना ​​है कि पहले समाधान स्पष्ट पर्याप्त है, लेकिन मुहावरेदार है। मेरे अनुभव में, कुछ कोड समीक्षा एक टिप्पणी के लिए पूछने की व्याख्या करने के यह क्या करता है ...

    प्रश्न

    वहाँ एक निरपेक्ष पथ का निर्माण करने के लिए एक बेहतर तरीका है रूबी, जहां बेहतर साधन "करता है नौकरी और खुद के लिए बोलता है "?

+2

मैं सिर्फ कोड समीक्षा में दस्तावेज़ को लिंक करता हूं। यह स्पष्ट रूप से कहता है "फ़ाइल :: SEPARATOR का उपयोग कर तारों में शामिल होने से गठित एक नई स्ट्रिंग देता है।" पोर्टेबल पथ बनाने के लिए 'फाइल # जॉइन' सामान्य तरीका है। –

+1

"मनमानी ओएस", "tmp/abc /" 'स्ट्रिंग अक्षर के रूप में आपका मतलब क्या है, इसके आधार पर लिनक्स, मैक और विंडोज पर एक वैध पथ है। –

+0

प्रलेखन, या सिर्फ एक टिप्पणी के रूप में इच्छित मार्ग, अच्छी तरह से काम करता है। बस रूबी में छिपा या भूल गए मंत्र खोजने की कोशिश कर रहा है। –

उत्तर

3

यदि मैं कोड समीक्षा कर रहा था तो मैं क्या उठाऊंगा कि विंडोज /tmp पर अस्थायी निर्देशिका बनाने के लिए सबसे अच्छी जगह नहीं है, और प्रारंभिक '', तर्क शायद यह समीक्षा की जाने वाली प्रासंगिक समीक्षा के लिए स्पष्ट नहीं है <nothing>/tmp/abc। इसलिए, मैं इस कोड की सिफारिश करता हूं:

File.join(Dir.tmpdir(), 'abc') 

Ruby-doc for an explanation देखें।

अद्यतन

हम एक अधिक सामान्य समाधान है कि tmpdir() का उपयोग कर शामिल नहीं करता है करने के लिए समस्या का विस्तार है, मैं एक तरह से दौर प्रारंभिक '' मुहावरा का उपयोग कर नहीं देख सकते हैं (हैक?)। लिनक्स पर यह एक समस्या का बहुत अधिक नहीं है, शायद, लेकिन एकाधिक ड्राइव अक्षरों वाले विंडोज़ पर यह होगा। इसके अलावा, माउंट पॉइंट्स को फिर से चलाने के लिए रूबी एपीआई या मणि दिखाई नहीं देता है।

इसलिए, मेरी सिफारिश एक विन्यास विकल्प है कि एक सांबा शेयर के लिए लिनक्स के लिए '/', विंडोज के लिए 'z:/', और smb://domain;[email protected]/mountpoint हो सकता है करने के लिए माउंट बिंदु परिभाषा को सौंपने के लिए, तो File.join(ProjectConfig::MOUNT_POINT, 'some', 'where', 'abc') का उपयोग किया जाएगा।

+0

tmpdir पर अच्छी पकड़। यह और भी पोर्टेबल है और इरादे को बेहतर ढंग से प्रतिबिंबित करता है। +1 –

+0

इस सुझाव के लिए धन्यवाद। मेरी विशेष समस्या को हल करने के लिए उत्कृष्ट। मैं अभी तक प्रश्न के रूप में चिह्नित नहीं है। चलो देखते हैं कि किसी के पास सामान्य समस्या का अच्छा विचार है (अब यह महसूस हो रहा है कि '/ tmp' प्रश्न को अप्रत्याशित तरीके से ले जाता है)। –

+1

@ एरिक मैं देखता हूं कि आपने सवाल उठाया! मेरे पास एक विचार और चारों ओर एक नज़र है, और मुझे एक सामान्य समाधान नहीं दिख रहा है जो मुझे सबसे असहज बनाता है, अग्रणी '' '। ऐसा लगता है कि माउंट पॉइंट्स को फिर से शुरू करने का कोई सामान्य तरीका नहीं है, जैसे विंडोज़ के लिए 'c: /' या लिनक्स पर सांबा माउंट पॉइंट प्राप्त करना आदि। शायद कॉन्फ़िगरेशन विकल्प पर माउंट पॉइंट परिभाषा को प्रतिनिधि करना सबसे अच्छा समझौता है और ' File.join (ProjectConfig :: MOUNT_POINT, 'foo', 'bar') '? –

2

File#join रूबी में पोर्टेबल पथ बनाने का वैचारिक तरीका है। मैं सोच रहा हूं कि समीक्षा कौन कर रही है। शायद रूबी आपके संगठन के लिए नया है।

मैं @ChrisHeald से सहमत हूं कि दस्तावेज़ीकरण का जिक्र करना एक समीक्षक को कोड समझाए जाने का सबसे अच्छा तरीका है।

+0

धन्यवाद। मैं अब तक सभी टिप्पणियों से सहमत हूं, इसलिए +1। फ़ाइल # शामिल होना मेरा पसंदीदा दृष्टिकोण है, लेकिन एक मुहावरे पर निर्भर करता है। प्रश्न वास्तव में इस समस्या को हल करने के लिए एक बेहतर तरीका "दिखा रहा है" के बारे में है (यदि कोई है) --- समीक्षा सिर्फ यह बताती है कि क्या हो सकता है। –

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