2010-01-03 12 views
23

संयोजित करने के लिए एक फ़ाइल पथ के दो हिस्सों, आपसी # में, मैं एक बार में फ़ाइल पथ के दो से अधिक हिस्सों को कैसे जोड़ूं?

System.IO.Path.Combine (path1, path2); 

कर सकते हैं हालांकि, अगर आप

System.IO.Path.Combine (path1, path2, path3); 

ऐसा नहीं कर सकते वहाँ यह करने के लिए एक आसान तरीका है?

उत्तर

21

दूसरों के रूप में ने कहा है, .NET 3.5 और पुराने संस्करणों में यह अच्छी तरह से करने का कोई तरीका नहीं रहा है - आपको या तो अपनी खुद की Combine विधि लिखनी है या Path.Combine कई बार कॉल करना है।

लेकिन आनन्दित - .NET 4.0 में, वहाँ है के लिए this overload:

public static string Combine(
    params string[] paths 
) 

वहाँ भी ले जा रहे हैं भार के 3 या 4 तार, शायद इतना है कि यह आम मामलों के लिए अनावश्यक रूप से एक सरणी बनाने के लिए की जरूरत नहीं है ।

उम्मीद है कि मोनो जल्द ही उन अधिभारों को बंद कर देगा - मुझे यकीन है कि उन्हें लागू करना आसान होगा और बहुत सराहना की जाएगी।

+0

एकल सरणी को और अधिक कुशल घोषित नहीं करना चाहिए, फिर 4 अलग-अलग चर घोषित करना चाहिए? 4 या 3 स्ट्रिंग अधिभार के कारण क्या हो सकता है? –

+1

@ हसन: नहीं, एक सरणी बनाने के लिए एक अलग वस्तु की आवश्यकता होती है जिसे बाद में एकत्रित कचरा होना चाहिए। दो अलग-अलग चरों को पास करना दो संदर्भों वाले एक नए सरणी बनाने से अधिक कुशल है। –

+5

प्रतीक्षा करने की कोई आवश्यकता नहीं है, इसे 10/21/09 से लागू किया गया है :) http://anonsvn.mono-project.com/viewvc?view=revision&revision=144597 –

4

नहीं - आपको कई बार Path.Combine() पर कॉल करना होगा।

public static string CombinePaths(params string[] paths) { 
    if (paths == null) { 
     return null; 
    } 
    string currentPath = paths[0]; 
    for (int i = 1; i < paths.Length; i++) { 
     currentPath = Path.Combine(currentPath, paths[i]); 
    } 
    return currentPath; 
} 
+1

+1 में पेश अधिभार - बिल्कुल सही है क्योंकि आप कोई अनावश्यक LINQ गयी। – ChaosPandion

+1

तर्क पर एक नज़र डालने पर आप कथन के उस सेकंड से आसानी से छुटकारा पा सकते हैं। – ChaosPandion

+1

@ChosPandion: यदि आप लिंक से बचने जा रहे हैं तो आपको श्लेमेल-द-पेंटर एल्गोरिदम को भी अनुकूलित करना चाहिए और इसके बजाय पथ 'पैथसेपरेटर और अन्य स्टैटिक फ़ील्ड' स्ट्रिंगबिल्डर 'के साथ उपयोग करना चाहिए। मुझे लगा कि प्रदर्शन यहां कोई मुद्दा नहीं था। – Aaronaught

4

सरल नहीं है, लेकिन चालाक :)

string str1 = "aaa", str2 = "bbb", str3 = "ccc"; 
string comb = new string[] { str1, str2, str3 } 
    .Aggregate((x, y) => System.IO.Path.Combine(x, y)); 

या::

आप एक सहायक विधि है कि यह आप के लिए करता है, हालांकि लिख सकता है

string CombinePaths(params string[] paths) 
{ 
    return paths.Aggregate((x,y) => System.IO.Path.Combine(x, y)); 
} 
+1

यह आसान है अगर आप इसे एक से अधिक बार नहीं कर रहे हैं। आप इसे बहुत सरल बना सकते हैं, हालांकि: 'नया [] {"aaa", "bbb", "ccc"} .ggregate (Path.Combine);' (मान लीजिए कि आप System.IO का उपयोग कर रहे हैं; ')। –

30

यहाँ एक है उपयोगिता विधि का आप उपयोग कर सकते हैं:

public static string CombinePaths(string path1, params string[] paths) 
{ 
    if (path1 == null) 
    { 
     throw new ArgumentNullException("path1"); 
    } 
    if (paths == null) 
    { 
     throw new ArgumentNullException("paths"); 
    } 
    return paths.Aggregate(path1, (acc, p) => Path.Combine(acc, p)); 
} 

वैकल्पिक कोड गोल्फ संस्करण (छोटे, लेकिन काफी के रूप में स्पष्ट नहीं, अर्थ विज्ञान Path.Combine से थोड़ा अलग हैं):

public static string CombinePaths(params string[] paths) 
{ 
    if (paths == null) 
    { 
     throw new ArgumentNullException("paths"); 
    } 
    return paths.Aggregate(Path.Combine); 
} 

तो फिर तुम के रूप में इस कॉल कर सकते हैं:

string path = CombinePaths(path1, path2, path3); 
+0

@ डाउनवॉटर: चलो इसे सुनें। – Aaronaught

+0

यह एक बेवकूफ सवाल हो सकता है, लेकिन कुल मिलाकर कहां से आता है? मैं मोनो लक्ष्यीकरण मोनो/नेट 3.5 का उपयोग कर रहा हूं, और संकलक इसे नहीं ढूंढ सकता है। –

+1

'सिस्टम का उपयोग कर .Linq'। – SLaks

0
विधि के साथ

नेट 4 Path.Combine(string [])

Path.Combine(new [] { "abc", "def", "ghi", "jkl", "mno" }); 
संबंधित मुद्दे