2009-06-26 4 views
49

फ़ाइल नाम के साथ पथ को गठबंधन करने का सबसे अच्छा तरीका क्या है?सी #/.NET में पथ और फ़ाइल नाम को गठबंधन करने का सबसे अच्छा तरीका क्या है?

यह c:\foo और bar.txt दिया गया है, मुझे c:\foo\bar.txt चाहिए।

को देखते हुए c:\foo और ..\bar.txt, मैं या तो एक त्रुटि या c:\foo\bar.txt (तो मैं Path.Combine() सीधे उपयोग नहीं कर सकते) चाहते हैं। इसी तरह c:\foo और bar/baz.txt के लिए, मुझे एक त्रुटि या c:\foo\baz.txt (c:\foo\bar\baz.txt नहीं) चाहिए।

मुझे एहसास है, मैं जांच सकता हूं कि फ़ाइल नाम में '\' या '/' नहीं है, लेकिन क्या यह पर्याप्त है? यदि नहीं, तो सही जांच क्या है?

उत्तर

83

यदि आप चाहते हैं "बुरा" के लिए फ़ाइल नाम एक त्रुटि उत्पन्न करें:

if (Path.GetFileName(fileName) != fileName) 
{ 
    throw new Exception("'fileName' is invalid!"); 
} 
string combined = Path.Combine(dir, fileName); 

या, यदि आप चुपचाप "खराब" फ़ाइल नामों को पूर्व में फेंकने के बिना चुपचाप सही करना चाहते हैं धारणा:

string combined = Path.Combine(dir, Path.GetFileName(fileName)); 
+9

ढांचे से कम परिचित लोगों के लिए, आपको 'पथ' तक पहुंच प्राप्त करने के लिए अपनी फ़ाइल में 'System.IO;' का उपयोग करने की आवश्यकता है। –

+2

ध्यान दें कि 'पथ। कॉम्बाइन' एक तर्क 'ArgumentNullException' फेंक देगा यदि उसके तर्कों में से कोई भी' शून्य 'है। आप ** ** –

+2

पर तर्क के लिए एक खाली स्ट्रिंग पास कर सकते हैं नोट: पथ। कॉम्बाइन सामान्य रूप से आवश्यक होने पर प्रत्येक पथ के बीच एक विभाजक जोड़ देगा। हालांकि, पथ। कॉम्बाइन ("सी:", "file.txt"), "सी: file.txt" देता है, जो वैध पथ नहीं है। – ConditionRacer

16

आप इस्तेमाल कर सकते हैं:

Path.Combine(folder, Path.GetFileName(fileName)) 

या, \ बाहर छोड़ने के लिए (परीक्षण नहीं किया है, शायद Path.GetFileName यह स्वचालित रूप से संभालती है)

Path.Combine(folder, Path.GetFileName(fileName.Replace("/","\\"))) 
+4

धन्यवाद! बस एफवाईआई: प्रतिस्थापन आवश्यक नहीं है। –

1

ध्यान रखें कि जब आप Path.Combine(arg1, arg2) का उपयोग करें - यह ARG1 उपेक्षा होगा अपने उपयोगकर्ता ARG2 के लिए एक पूरी तरह से योग्य फ़ाइल पथ आदानों हैं, और ARG2 मार्ग के रूप में इस्तेमाल करते हैं।

मेरी राय में, माइक्रोसॉफ्ट वहां खराब हो गया! यह आपको अपने पूरे फाइल सिस्टम हैकिंग करने वाले उपयोगकर्ता के साथ व्यापक रूप से खुला छोड़ सकता है। चेतावनी दी, ठीक प्रिंट पढ़ें! यदि आप मार्गों का उपयोग कर रहे हैं: var newPath = path1 + @"\" + path2; सरल और कोई अप्रत्याशित परिणाम नहीं ...

+0

रिश्तेदार पथों के संयोजन के परिणामस्वरूप दायीं तरफ एक पूर्ण पथ वापस किया जा रहा है एक सही और वैध परिणाम है। –

+1

भले ही यह सही और वैध परिणाम हो, बहुत सारे देव इस तथ्य को याद कर रहे हैं कि यदि उनके कोड arg1 में एक फ़ोल्डर पथ है और arg2 उपयोगकर्ता इनपुट है, तो एक पूर्ण पथ इनपुट arg2 परिणामस्वरूप आउटपुट होगा। मेरी राय में खोलना बहुत आसान बनाता है वेब ऐप हैक का सबसे खराब .. कोड/खोल इंजेक्शन ... अपने इनपुट लोगों की जांच करें। – Cyassin

+0

मेरी राय में, किसी भी डेवलपर जो सोचता है कि यह ठीक है कि उपयोगकर्ता को किसी भी जांच के बिना पथ टाइप करने की अनुमति देना ठीक है - हैक होने का हकदार है। यह दिन वन सामान और पथ है। कॉम्बाइन को जिस तरह से आपको लगता है उसे काम करने के लिए डिज़ाइन नहीं किया गया है - टर्मिनल बैकस्लैश की जांच करने से बचने के लिए यह एक सभ्य और मजबूत तरीका है, जो वास्तव में आपके कोड द्वारा आंतरिक उपयोग के लिए है, अपनी फाइलों को सुरक्षित करने के लिए फ्रंट एंड के रूप में नहीं। इसके लिए प्रलेखन काफी पूरा है - बस इसे पढ़ें। – jinzai

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^