Node.js में path.normalize और path.resolve के बीच अंतर


86

अंतर (यदि हो तो) के बीच क्या है path.normalize(your_path)और path.resolve(your_path)?

मुझे पता है कि path.resolve(...)कई तर्क स्वीकार कर सकते हैं, लेकिन क्या एक ही तर्क के साथ व्यवहार कॉलिंग के समान है path.normalize()?

संपादित करें: यदि वे उसी तरह से व्यवहार करने वाले हैं, तो मुझे path.normalize(...)फ़ंक्शन को उजागर करने का उद्देश्य समझ में नहीं आता है जब आप बस path.resolve(...)या तो पथ को पास कर सकते हैं , हो सकता है, यह प्रलेखन उद्देश्यों के लिए हो। उदाहरण के लिए, वे कहते हैं path.resolve(...):

... परिणामी मार्ग सामान्यीकृत है, और ...

एक्सपोज़ करने path.normalize(...)से यह स्पष्ट करना आसान हो जाता है कि "सामान्यीकृत" का मतलब क्या है ??? मुझे नही पता।

जवाबों:


182

path.normalizeअतिरिक्त से छुटकारा मिलता है ., ..रास्ते में, आदि। path.resolveएक पथ को निरपेक्ष मार्ग में बदल देता है। उदाहरण (मेरी वर्तमान कार्यशील निर्देशिका थी /Users/mtilley/src/testing):

> path.normalize('../../src/../src/node')
'../../src/node'
> path.resolve('../../src/../src/node')
'/Users/mtilley/src/node'

दूसरे शब्दों में, path.normalize"क्या सबसे छोटा रास्ता है जो मैं ले जा सकता हूं जो मुझे इनपुट के समान स्थान पर ले जाएगा", जबकि path.resolve"अगर मैं इस रास्ते को ले जाऊं तो मेरी मंजिल क्या है।"

नोट तथापि कि path.normalize()है बहुत अधिक संदर्भ स्वतंत्र से path.resolve()। था path.normalize()किया गया संदर्भ- डे लटकता हुआ (यानी अगर यह ध्यान में वर्तमान कार्यशील निर्देशिका लिया था) के ऊपर किया गया है जाएगा उदाहरण में, परिणाम ../nodeहै, क्योंकि वह सबसे छोटा रास्ता एक से ले सकता है है /Users/mtilley/src/testingके लिए /Users/mtilley/src/node

विडंबना यह है कि इसका मतलब यह है कि path.resolve()आप पूर्ण रूप से एक सापेक्ष पथ का निर्माण करते हैं (आप इसे कहीं भी निष्पादित कर सकते हैं, और यह उसी परिणाम का उत्पादन करेगा), जबकि path.normalize()सापेक्ष शब्दों में एक पूर्ण पथ का निर्माण करता है (आपको इसे उसी पथ पर निष्पादित करना होगा जिसके सापेक्ष आप चाहते हैं पूर्ण परिणाम की गणना)।


अच्छा लगा। जवाब के लिए धन्यवाद! यह मुझे थोड़ी देर के लिए परेशान कर रहा है। नोड डॉक्स, जबकि वे आम तौर पर काफी अच्छे हैं, मुझे इस पर थोड़ा हैरान कर दिया।
बीएमनर

14
यह भी ध्यान दें कि path.normalize किसी भी पथ को संभाल सकता है जिसे आप सामान्य करना चाहते हैं और पथ के केवल स्ट्रिंग हेरफेर का मतलब है, जबकि path.resolve एक निरपेक्ष पथ के लिए पथ को हल करने के लिए फाइल सिस्टम और वर्तमान निर्देशिका का उपयोग करेगा। यह उन्हें पथ के रूप में बहुत भिन्न व्यवहार करता है। एक टार फाइल के अंदर एक पथ पर, एक दूरस्थ फाइल सिस्टम पर, या पूरी तरह से अमूर्त कुछ भी हो सकता है।
नेकेडबल

वे पथ से अलग कैसे हैं।
9

2

डॉक्स से:

संकल्प के बारे में सोचने का एक और तरीका एक शेल में सीडी कमांड का एक क्रम है।

प्रलेखन में path.resolve और path.normalize के लिंक । मैं ज्यादातर केवल एक उत्तर में लिंक प्रदान नहीं करना चाहता, लेकिन Node.js डॉक्स बहुत सभ्य हैं।


मुझे लगता है कि मैं सामान्यीकरण (...) फ़ंक्शन को उजागर करने के उद्देश्य को नहीं समझता हूं जब आप बस पथ को पथ में भेज सकते हैं। समाधान (...)
बीएमएनर

6
जिस पथ को आप सामान्य कर रहे हैं वह वास्तव में फाइल सिस्टम में मौजूद नहीं हो सकता है, जैसे कि आप उस फाइल के लिए एक पथ को सामान्य कर सकते हैं जिसे आप बनाने जा रहे हैं, या आप सापेक्ष URL पथों को सामान्य कर सकते हैं।
lanzz

वास्तव में मुझे नहीं पता कि आप संकल्प पर सामान्यीकरण का उपयोग क्यों करेंगे।
पिकल्स

1
सामान्य करने के लिए एक निरपेक्ष पथ को पूरा नहीं करता है। तो इसका उपयोग किसी अन्य स्रोत के सापेक्ष कुछ रिसोर्स के लिए एक सामान्य पथ प्राप्त करने के लिए किया जा सकता है, जिसका उपयोग उदाहरण के लिए उपयोगकर्ता द्वारा चुनी गई फ़ाइल को संदर्भित करने के लिए HTML के अंदर किया जा सकता है। जैसा कि सामान्यीकृत पथ हमेशा सरल होता है (कोई अतिरिक्त नहीं ../) यह आसानी से जांचा जा सकता है ताकि उपयोगकर्ता केवल कुछ विशेष स्थानों से फ़ाइलों को काट सके और इस स्थानों के बाहर निजी फ़ाइलों को देखने का कोई मौका न हो।
23
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.