2011-04-21 10 views
21

मेरे आश्चर्य करने के लिए, इस कोड की उम्मीद परिणामों का उत्पादन नहीं करता:पथ। कॉम्बिन इस परिणाम को सापेक्ष पथ के साथ क्यों उत्पन्न करता है?

var basePath = @"\\server\BaseFolder"; 
var relativePath = @"\My\Relative\Folder"; 

var combinedPath = Path.Combine(basePath, relativePath); 

परिणाम की उम्मीद \\server\BaseFolder\My\Relative\Folder के बजाय \My\Relative\Folder है।

यह क्यों है? उन सापेक्ष पथों को गठबंधन करने का सबसे अच्छा तरीका क्या है जो उनमें स्लैश हो या न हो?

संपादित करें: मुझे पता है कि मैं सिर्फ relativePath पर स्ट्रिंग परिवर्तन कर पता लगाने और एक शुरू करने स्लेश दूर करने के लिए कर सकते हैं। क्या ऐसा करने का कोई सुरक्षित तरीका है (मैंने सोचा था कि Path.Combine सुरक्षित तरीका माना जाता था) जो बैकस्लाश और मोर्चबॉश के लिए जिम्मेदार होगा?

+9

यह _relative_ पथ नहीं है। – SLaks

+0

मैं समझूंगा कि अगर फ्रंट पर 2 बैकस्लैश थे, तो इसे यूएनसी पथ बनाते हुए, लेकिन एक स्लैश? गंभीरता से? – Brandon

+5

हां; गंभीरता से। '\ a \ b' एक ** पूर्ण ** पथ है। (हालांकि यह ड्राइव के सापेक्ष है) – SLaks

उत्तर

33

relativePath पर अग्रणी स्लैश ड्रॉप करें और इसे काम करना चाहिए।

ऐसा क्यों होता है यह कारण है कि पथ। कॉम्बिन relativePath को रूट (पूर्ण) पथ के रूप में व्याख्या कर रहा है क्योंकि, इस मामले में, यह \ से शुरू होता है। Path.IsRooted() का उपयोग करके आप जांच सकते हैं कि कोई पथ सापेक्ष या रूट है या नहीं।

doc से:

बाद पथ में से एक एक पूर्ण पथ है, तो वह निरपेक्ष पथ के साथ शुरू आपरेशन फिर सेट करता है गठबंधन, सभी पिछले संयुक्त रास्तों को त्यागकर।

18

पथ जो स्लैश से शुरू होते हैं उन्हें सापेक्ष से पूर्ण होने के रूप में व्याख्या किया जाता है। यदि आप गारंटी देना चाहते हैं कि relativePath को सापेक्ष के रूप में माना जाएगा तो बस स्लैश बंद करें।

var basePath = @"\\server\BaseFolder"; 
var relativePath = @"\My\Relative\Folder"; 

var combinedPath = Path.Combine(basePath, relativePath.TrimStart('/', '\\')); 
संबंधित मुद्दे