क्या आपको node.js में path.join का उपयोग करने की आवश्यकता है?


134

जैसा कि सभी जानते हैं कि विंडोज बैकस्लैश के साथ पथ करता है, जहां यूनिक्स आगे की स्लैश के साथ पथ करता है। नोड.जेएस path.join()हमेशा सही स्लैश का उपयोग करने के लिए प्रदान करता है। इसलिए उदाहरण के लिए यूनिक्स लिखने के बजाय 'a/b/c'आप केवल path.join('a','b','c')इसके बजाय करेंगे ।

हालाँकि, ऐसा लगता है कि इस अंतर के बावजूद अगर आप अपने रास्तों (जैसे path.join का उपयोग करके) को सामान्य नहीं करते हैं और केवल a/b/cनोड की तरह पथ लिखते हैं । तो आपको Windows पर अपनी स्क्रिप्ट चलाने में कोई समस्या नहीं है।

तो क्या ओवर राइटिंग path.join('a','b','c')से कोई फायदा है 'a/b/c'? दोनों प्लेटफॉर्म की परवाह किए बिना काम करते हैं ...

जवाबों:


106

पथ विभाजक के रूप में विंडोज फाइलसिस्टम को आगे या पीछे की ओर स्लैश का उपयोग करने में कोई समस्या नहीं है (यह पिछले दिनों से वापस आ गया है)। एकमात्र वास्तविक मुद्दा यह है कि विंडोज कमांड-लाइन प्रोसेसर (या, विशेष रूप से, विंडोज-देशी कमांड-लाइन यूटिलिटीज) पथ के बजाय विकल्प स्पेसर के रूप में फॉरवर्ड स्लैश की व्याख्या करते हैं। इसलिए, यदि आपको एक सबप्रोसेस के रूप में विंडोज कमांड चलाने के लिए एक पथ पास करने की आवश्यकता है, तो आपको बैकस्लेस्ड पथ की आवश्यकता है। इसके अलावा, Windows API कॉल (और उच्च-स्तरीय भाषाओं से विधियाँ जो Windows API कहलाती हैं), जो पथ को वापस लाती हैं, बैकस्लैश का उपयोग करेंगी, इसलिए यदि आप उन्हें उपप्रकारों में नहीं दे रहे हैं, तो आपको उन्हें सामान्य करने की आवश्यकता होगी।


फॉरवर्ड स्लैश भी UNC के रास्तों को तोड़ते हैं।
user2426679

यह उत्तर स्पष्ट नहीं करता है कि इसका उपयोग सामान्य Node.js एप्लिकेशन में क्यों किया गया है। या शायद यह सिर्फ मुझे नहीं मिल रहा है। हालांकि यह दिलचस्प था।
घुमर

96

path.join यदि आवश्यक रास्ते अज्ञात स्रोतों (जैसे उपयोगकर्ता इनपुट, 3 पार्टी एपीआई आदि) से आते हैं, तो हो सकता है कि अकारण सीमांकक का ध्यान रखा जाए।

तो path.join('a/','b') path.join('a/','/b'), path.join('a','b')और path.join('a','/b')सभी देंगे a/b

इसका उपयोग किए बिना, आप आमतौर पर शामिल किए गए रास्तों की शुरुआत और अंत के बारे में अपेक्षाएं करेंगे, यह जानते हुए कि उनके पास केवल एक या कोई स्लैश नहीं है।


यह थोड़ा उपयोगी लगता है लेकिन अज्ञात स्रोतों से अनियंत्रित अनियंत्रित पथ प्राप्त करना एक बड़ी सुरक्षा समस्या की तरह लगता है। यह अक्सर करने के लिए कुछ नहीं है।
Gherman

50

मैं path.joinयह सुनिश्चित करने के लिए उपयोग करता हूं कि फ़ोल्डर विभाजक सही स्थानों पर हैं, यह सुनिश्चित करने के लिए आवश्यक नहीं है कि यह आगे या पीछे के स्लैश का उपयोग करता है। उदाहरण के लिए:

path.join("/var/www", "test")

Www और परीक्षण के बीच विभाजक को सही ढंग से सम्मिलित करेगा /var/www/test


2
मुझे यह बात समझ में नहीं आती। यदि आपके पास वे स्क्रिप्ट हैं जो चर में हैं, तो केवल स्लैश को मैन्युअल रूप से क्यों न जोड़ें?
मैजोल

2
मुझे भी इस उत्तर को समझने में परेशानी होती है। कोई मूल्य नहीं देख सकता।
oligofren

23
क्योंकि मुझे हमेशा यकीन नहीं है कि अन्य स्रोतों से मुझे मिलने वाले पथ मूल्यों में पीछे की ओर खिसकना होगा या नहीं। ऊपर मेरे उदाहरण से वंचित था। अक्सर उन रास्तों को हार्ड कोड नहीं किया जाता है, लेकिन अन्य कॉन्फिग फाइल्स, यूजर इनपुट, लाइब्रेरियों आदि से खींचे जा रहे हैं
टिमोथी स्ट्रिम्पल

@TimothyStrimple ~ उपयोग करने के लिए एक अच्छी जगह path.joinअपने अन्य उत्तर में यहां होगी stackoverflow.com/questions/9027648/… । उस उत्तर ने मुझे यहाँ एक और प्रश्न का उत्तर दिया जो खुद :) :)
पेब्बल

23
मैं उस उत्तर के बारे में भी उलझन में था जब तक कि 5 मिनट बाद मेरा कोड नहीं निकला return baseDir + relativePath + filename;। मैंने इसे तुरंत बदल दिया return path.join(baseDir, relativePath, filename);। यह वास्तव में बहुत मददगार है!
पेड्रो

34

संक्षिप्त जवाब:

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

लंबा जवाब:

सभी fs.*फ़ंक्शन कॉल करते हैं path._makeLong(path), जो बदले में कॉल करते हैं path.resolve(path), जिसमें विंडोज के लिए विशेष RegExps है, जो बैकस्लैश \या फॉरवर्ड स्लैश को ध्यान में रखता है /। आप अपने स्रोत कोड को देख कर अपने लिए इसे देख सकते हैं:

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