2016-08-23 9 views
37

साथ path.resolve बनाम वहाँ एक अंतर जब का उपयोग कर है दोनोंpath.join और Node.js में निरपेक्ष पथ हल करने के लिए __dirname साथ path.resolve? जब इस तरह इस्तेमाल किया जा रहाpath.join __dirname

उनमें से एक होना चाहिए प्राथमिकता दी जानी (निरपेक्ष पथ प्रस्तावों उपयोग के मामलों के 90% कर रहे हैं)?

आईई।

const absolutePath = path.join(__dirname, some, dir); 

बनाम

const absolutePath = path.resolve(__dirname, some, dir); 

दोनों ही तरीकों से पथ सामान्य बनाते हैं।

यह this question का डुप्लिकेट नहीं है क्योंकि स्वीकृत उत्तर गलत है।

उत्तर

46

हाँ वहाँ कार्यों लेकिन कैसे आप इस मामले में उन्हें प्रयोग कर रहे हैं समान परिणाम होगा बीच एक अंतर है।

path.join दो रास्ते एक साथ विलय से एक सामान्यीकृत पथ देता है। यह एक निरपेक्ष पथ लौट सकते हैं, लेकिन यह जरूरी नहीं कि हमेशा ऐसा नहीं करता है।

उदाहरण के लिए:

path.join('app/libs/oauth', '/../ssl') 

निराकरण app/libs/ssl

path.resolve करने के लिए, दूसरे हाथ पर, एक निरपेक्ष पथ हो जाएगी।

उदाहरण के लिए, जब आप चलाएँ:

path.resolve('bar', '/foo'); 

पथ लौटे /foo हो जाएगा के बाद से है कि पहले निरपेक्ष पथ है कि निर्माण किया जा सकता है।

हालांकि, अगर आप चलाएँ:

path.resolve('/bar/bae', '/foo', 'test'); 

पथ लौटे /foo/test फिर से किया जाएगा, क्योंकि वह पहले निरपेक्ष पथ है कि एक दाईं से बाईं ओर का गठन किया जा रहा है।

यदि आप रूट निर्देशिका निर्दिष्ट करने वाले पथ प्रदान नहीं करते हैं तो resolve फ़ंक्शन को दिए गए पथ वर्तमान कार्य निर्देशिका में संलग्न हैं। इसलिए यदि आपके कार्यशील निर्देशिका /home/mark/project/ था:

path.resolve('test', 'directory', '../back'); 

/home/mark/project/test/back

पर ले कर जाता __dirname अपने वर्तमान कार्यशील निर्देशिका के लिए एक निरपेक्ष पथ देता है का उपयोग करना। जब आप path.resolve या path.join का उपयोग वे एक ही परिणाम लौट यदि आप निम्न __dirname उसी रास्ते दे देंगे। ऐसे मामलों में यह वास्तव में प्राथमिकता का सिर्फ एक बात है।

+10

नाइट: '__dirname' उस स्रोत फ़ाइल के साथ पूर्ण पथ है जिसे निष्पादित किया जा रहा स्रोत फ़ाइल है, न कि * वर्तमान कार्यशील निर्देशिका *।पूर्व हमेशा एक ही होगा (जब तक आप फ़ाइल को स्थानांतरित नहीं करते); उत्तरार्द्ध एक [प्रक्रिया-व्यापी पैरामीटर] (https://nodejs.org/docs/latest/api/process.html#process_process_cwd) है जो कि नोड को लॉन्च करने के तरीके के आधार पर भिन्न होता है और आपने इसे बदल दिया है या नहीं [इसे बदल दिया है] (https://nodejs.org/docs/latest/api/process.html#process_process_chdir_directory)। – josh3736

+0

तो '' '__dirname'''' '' path.resolve (__ dirname) '' 'के बीच कोई अंतर नहीं है? – georaldc

2
const absolutePath = path.join(__dirname, some, dir); 

बनाम।

const absolutePath = path.resolve(__dirname, some, dir); 

path.join __dirname जो वर्तमान मंच विशिष्ट विभाजक

जहां

path.resolve रूप __dirname, some और dir यानी कार्रवाई करेंगे साथ some और dir के मूल्यों के साथ concatenated फ़ाइल की निर्देशिका का नाम है श्रेणीबद्ध होगा इसे संसाधित करके इसे बाएं से दाएं से आगे बढ़ाएं।

अगर some या dir के मूल्यों के किसी भी रूट के रूप में यह विचार

Inorder बेहतर समझने के लिए द्वारा एक रूट पथ फिर पिछले पथ लोप हो जाएगा और इस प्रक्रिया बाकी से मेल खाती है अवधारणा मुझे समझाती हूँ दोनों छोटा सा निम्नानुसार विस्तृत: -

path.join और path.resolve नोडजेस द्वारा प्रदत्त पथ मॉड्यूल के दो अलग-अलग तरीके या कार्य हैं।

जहां दोनों पथ की एक सूची स्वीकार करते हैं लेकिन परिणाम में अंतर आता है यानी वे इन पथों को कैसे संसाधित करते हैं।

path.join प्लेटफार्म विशिष्ट विभाजक का उपयोग एक डेलीमीटर के रूप में एक साथ सभी दिए गए पथ खंडों को एक साथ जोड़ता है, फिर परिणामी पथ को सामान्य करता है। जबकि path.resolve() पथों के अनुक्रम को दाएं से बाएं तक संसाधित करता है, प्रत्येक पूर्ण पथ के साथ एक पूर्ण पथ का निर्माण होने तक प्रीपेड किया जाता है।

मेरी फ़ाइल नाम index.js है और वर्तमान कार्यशील निर्देशिका E:\MyFolder\Pjtz\node

const path = require('path'); 

console.log("path.join() : ", path.join()); 
// outputs . 
console.log("path.resolve() : ", path.resolve()); 
// outputs current directory or equalent to __dirname 

परिणाम

है -:

कोई तर्क की आपूर्ति की

उदाहरण के बाद आपकी मदद करेगा जब स्पष्ट रूप से दोनों अवधारणाओं को समझने के लिए

λ node index.js 
path.join() : . 
path.resolve() : E:\MyFolder\Pjtz\node 

path.resolve() विधि पूर्ण पथ आउटपुट करेगा जहां path.join() रिटर्न होगा। अगर कुछ भी नहीं

प्रदान की जाती है कुछ रूट पथ तर्क के रूप में विशिष्ट मंच के साथ

const path=require('path'); 

console.log("path.join() : " ,path.join('abc','/bcd')); 
console.log("path.resolve() : ",path.resolve('abc','/bcd')); 

परिणाम मैं इनपुट सूची

λ node index.js 
path.join() : abc\bcd 
path.resolve() : E:\bcd 

path.join() केवल concatenates पारित हो जाता है जब वर्तमान कार्यशील निर्देशिका का प्रतिनिधित्व विभाजक जबकि path.resolve() पथ के अनुक्रम को दाएं से बाएं तक संसाधित करता है, प्रत्येक बाद के पथ पी के साथ एक पूर्ण पथ का निर्माण होने तक repended।

+0

प्रश्न विशेष रूप से * path.join बनाम path.resolve ** के साथ __dirname *** के साथ था। – estus

+0

मैंने आपकी टिप्पणियों के आधार पर उत्तर अपडेट किया था अपडेट के लिए धन्यवाद –

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