Path.resolve और path.join आह्वान के बीच अंतर?


191

निम्नलिखित आह्वान के बीच कुछ अंतर है?

path.join(__dirname, 'app')

बनाम

path.resolve(__dirname, 'app')

कौन सा पसंद किया जाना चाहिए?


इस सवाल पर मेटा
Nino Filiu

जवाबों:


255

दो कार्य /बहुत अलग-अलग तरीकों से शुरू होने वाले खंडों से संबंधित हैं; joinबस इसे पिछले तर्क के साथ समझेंगे, हालांकि resolveइसे रूट डायरेक्टरी के रूप में माना जाएगा, और सभी पिछले रास्तों को अनदेखा करें - इसे cdप्रत्येक तर्क के साथ निष्पादित करने के परिणाम के रूप में सोचें :

path.join('/a', '/b') // Outputs '/a/b'

path.resolve('/a', '/b') // Outputs '/b'

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

जिस के लिए आपको एक का उपयोग करना चाहिए, इसका उत्तर है: यह इस बात पर निर्भर करता है कि आप कैसे सेगमेंट को शुरू करना चाहते /हैं - क्या उन्हें बस में शामिल होना चाहिए या उन्हें नए रूट के रूप में कार्य करना चाहिए?

यदि अन्य तर्क कठिन हैं, तो यह वास्तव में मायने नहीं रखता है, जिस स्थिति में आपको शायद (ए) पर विचार करना चाहिए कि यह रेखा भविष्य में कैसे बदल सकती है और (ख) यह कोड में अन्य स्थानों के साथ कितना सुसंगत है।


64
यदि आप अभी भी इसे प्राप्त नहीं करते हैं: path.join('/a', '/b', 'c')वापस आ जाएगा /a/b/c, जबकि path.resolve('/a', '/b', 'c')वापस आ जाएगा /b/c
तात्यामेली

28
मैं कहूंगा कि का नाम resolveसबसे स्पष्ट नहीं है, path.cd([starting dir], [final dir])बहुत अधिक सहज होगा।
जॉयो पिमेंटेल फरेरा

19
think of it as the result of executing cd with each argumentमुझे अंत में यह समझ बना दिया। धन्यवाद
आन्द्रे पेना

@ JoãoPimentelFerreira, मैंने ऊपर दिए गए उत्तर को अपडेट कर दिया है क्योंकि आपने एक वैध बिंदु बनाया है। :)
रिन मिनसे

इसलिए path.resolve => कार्य निर्देशिका को पथ का प्रारंभिक बिंदु मानते हुए समाधान करें?
वेबवुमन

15

फ़ाइल सिस्टम पथ के डिफ़ॉल्ट संचालन ऑपरेटिंग सिस्टम के आधार पर भिन्न होते हैं, हमें कुछ ऐसी चीज़ की आवश्यकता होती है जो इसे अमूर्त करती है। pathमॉड्यूल फ़ाइल और निर्देशिका पथ के साथ काम करने के लिए उपयोगिताओं या एपीआई प्रदान करता है। आप इसे अपने प्रोजेक्ट में शामिल कर सकते हैं

const path = require('path');

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

ये दोनों विधियाँ पथ या पथ खंडों के अनुक्रम को स्वीकार करती हैं।

path.resolve()विधि एक में पथ या पथ के सेगमेंट के अनुक्रम का समाधान करता है निरपेक्ष पथ

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

बेहतर तरीके से समझने और व्यवहार में अंतर करने के लिए, मैं इसे विभिन्न परिदृश्यों के साथ समझाता हूं।

1. यदि हम किसी भी तर्कों या खाली स्ट्रिंग की आपूर्ति नहीं करते हैं

मेरे मामले में, मेरा फ़ाइल नाम है 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 of the node process

और चल रहे परिणाम के रूप में नीचे है

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

ऊपर प्रयोग से अनुमान था path.resolve()विधि है जहां path.join()रिटर्न के रूप में निरपेक्ष पथ का उत्पादन होगा । यदि कुछ भी प्रदान नहीं किया जाता है तो वर्तमान कार्य निर्देशिका या सापेक्ष पथ का प्रतिनिधित्व करना

2. किसी भी तर्क के रूप में / पथ जोड़ना।

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()केवल प्लेटफ़ॉर्म विशिष्ट विभाजक के साथ इनपुट सूची को सम्‍मिलित करता है, जबकि path.resolve()प्रक्रिया दाएं से बाएं, प्रत्येक बाद वाले पथ के साथ अनुक्रम बनाती है जब तक कि एक निरपेक्ष पथ का निर्माण नहीं हो जाता।

path.join()OS विशिष्ट विभाजकों के साथ प्रत्येक तर्क को सम्‍मिलित करता है, जबकि path.resolve()प्रत्येक तर्क को रूट और आउटपुट के साथ हल करेगा।


path.resolve()के बराबर नहीं है __dirname। पहला वर्किंग डायरेक्टरी लौटाता है, जबकि दूसरा करंट फाइल का रास्ता है।
एमिल बर्जरॉन

@EmileBergeron मेरी समझ में दोनों ही पथ पर कार्य कर रहे हैं। आप दोनों स्निपेट की कोशिश कर सकते हैं कि व्हीटर की जांच करें कि दोनों समान हैं जो मुझे लगता है। const path = require('path'); console.log(path.resolve()) console.log(__dirname) console.log(path.resolve()===__dirname)
samuelj90

वे केवल उसी समय होते हैं जब फ़ाइल चालू की जा रही कार्यशील निर्देशिका में होती है।
एमिल बर्जरॉन

@EmileBergeron ठीक है कि मैं सहमत हूँ। लेकिन Iam अभी भी उलझन में है जहाँ मैंने निर्दिष्ट कियाpath.resolve() is equivalent to __dirname
samuelj90

1
@EmileBergeron ने टिप्पणी को अपडेट किया था, मुझे लगता है कि यह
भ्रम को

13

1) path.resolve निरपेक्ष पथ बनाता है।

विधि निरपेक्ष पथ का निर्माण होने तक दाएं से बाएं ओर अनुपस्थित पथ बनाती है।

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

path.resolve('/a', 'b', 'c');     //    C:\a\b\c
path.resolve('/a', '/b', 'c');    //    C:\b\c
path.resolve('/a', '/b', '/c');   //    C:\c

यदि पूर्ण पथ उत्पन्न नहीं होता है, तो वर्तमान कार्यशील निर्देशिका का उपयोग करने की विधि:

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

path.resolve('a', 'b', 'c');     //    C:\{current_working_directory}\a\b\c

2) path.join सभी पथ को जोड़ता है और परिणाम को सामान्य करता है

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

path.join('/a', '/b', '/c');   //   \a\b\c
path.join('/a', '/b', 'c');    //   \a\b\c
path.join('/a', 'b', 'c');     //   \a\b\c
path.join('a', 'b', 'c');      //   \a\b\c

1
अंतिम सम्मिलित उदाहरण में path.join('a','b','c')परिणाम होना चाहिए a\b\c
spmdc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.