2009-07-09 3 views
160

में यूआरआई स्ट्रिंग से फ़ाइल का नाम प्राप्त करें मेरे पास स्ट्रिंग यूआरआई से फ़ाइल नाम को पकड़ने के लिए यह विधि है। इसे और अधिक मजबूत बनाने के लिए मैं क्या कर सकता हूं?सी #

private string GetFileName(string hrefLink) 
{ 
    string[] parts = hrefLink.Split('/'); 
    string fileName = ""; 

    if (parts.Length > 0) 
     fileName = parts[parts.Length - 1]; 
    else 
     fileName = hrefLink; 

    return fileName; 
} 

उत्तर

321

तुम सिर्फ एक System.Uri वस्तु बनाने के लिए, और Uri.LocalPath IsFile का उपयोग यह एक फ़ाइल सत्यापित करने के लिए है, तो फ़ाइल नाम निकालने के लिए कर सकते हैं।

यह अधिक सुरक्षित है, क्योंकि यह आपको यूआरआई की वैधता की जांच करने का साधन भी प्रदान करता है।


जवाब में संपादित करें टिप्पणी करने के लिए:

सिर्फ पूर्ण फ़ाइल नाम पाने के लिए, मैं का उपयोग करेंगे:

Uri uri = new Uri(hreflink); 
if (uri.IsFile) { 
    string filename = System.IO.Path.GetFileName(uri.LocalPath); 
} 

यह त्रुटि आप के लिए जाँच के सभी, और platform- है करता है तटस्थ। सभी विशेष मामलों को आपके लिए जल्दी और आसानी से संभाला जाता है।

+0

मैं मानता हूं, आपको वास्तव में उरी कक्षा का उपयोग करना चाहिए क्योंकि यह आपके लिए पहले से ही यह सामान करता है। +1 –

+0

यूप, जितना सरल हो सकता है उतना ही आपके यूरी क्लास में आपके लिए बहुत पहले से लुढ़का हुआ पार्सिंग/सत्यापन/एन्कोडिंग गुड्स है। – STW

+2

ठीक है, लेकिन मुझे बस फ़ाइल नाम की आवश्यकता है, पूर्ण फ़ाइल पथ नहीं। क्या मैं अभी भी Uri.LocalPath पर उस कदम को करने के लिए नहीं छोड़ा गया है? – paulwhit

7
using System.IO; 

private String GetFileName(String hrefLink) 
{ 
    return Path.GetFileName(hrefLink.Replace("/", "\\")); 
} 

इसका मतलब यह है, जाहिर है, कि आप फ़ाइल नाम पार्स किए गए हैं।

संपादित करें # 2: रिक्त स्थान

using System.IO; 

private String GetFileName(String hrefLink) 
{ 
    return Path.GetFileName(Uri.UnescapeDataString(hrefLink).Replace("/", "\\")); 
} 

इस संभाल चाहिए और फ़ाइल नाम में की तरह।

+3

सभी प्लेटफ़ॉर्म पर पथों में कॉलन स्वीकार्य नहीं हैं, इसलिए इस प्रकार का हैक एक * निक्स संस्करण पर चल रहे Mono.NET पर असफल हो सकता है। System.Uri का उपयोग करने के लिए बेहतर है क्योंकि यह विशेष रूप से ओपी की जरूरतों को करने के लिए डिज़ाइन किया गया है। – richardtallent

+1

एक वैध बिंदु! मैं हमेशा मोनो के बारे में भूल जाता हूँ। मैंने रिक्त स्थान और पसंद के बारे में सोचा, लेकिन कोलन नहीं। –

51

Uri.IsFile http urls के साथ काम नहीं करता है। यह केवल "फ़ाइल: //" के लिए काम करता है। MSDN से: "IsFile संपत्ति सच है जब योजना संपत्ति UriSchemeFile के बराबर होती है।" तो आप उस पर निर्भर नहीं हो सकते हैं।

Uri uri = new Uri(hreflink); 
string filename = System.IO.Path.GetFileName(uri.LocalPath); 
+0

उरी.लोकलपैथ विंडोज विशिष्ट रूपांतरण करता है और गैर-विंडोज वातावरण में सही तरीके से काम नहीं करता है। ऐसा करने के लिए एक पोर्टेबल तरीके के लिए नीचे मेरा जवाब देखें। –

+0

यह काम करता है। धन्यवाद – mjb

19

स्वीकृत उत्तर http urls के लिए समस्याग्रस्त है। इसके अलावा Uri.LocalPath विंडोज विशिष्ट रूपांतरण करता है, और जैसा कि किसी ने पत्ते को इंगित किया है वहां स्ट्रिंग क्वेरी स्ट्रिंग्स हैं।

Uri uri = new Uri(hreflink); 
string filename = System.IO.Path.GetFileName(uri.AbsolutePath); 
+0

ध्यान दें कि 'http: // example.com/dir/hello% 20world.txt' जैसे बच निकले यूआरएल के लिए यह' हैलो% 20world.txt' वापस लौटाएगा जबकि 'उरी.लोकलपाथ' दृष्टिकोण 'हैलो world.txt' ' –

23

अधिकांश जवाब या तो अधूरे हैं या सामान पथ के बाद आने वाले (क्वेरी स्ट्रिंग/हैश के साथ सौदा नहीं है: एक बेहतर तरीका है Uri.AbsolutePath

सही तरीके से उपयोग करने http यूआरएल के लिए यह करने के लिए है)।

readonly static Uri SomeBaseUri = new Uri("http://canbeanything"); 

static string GetFileNameFromUrl(string url) 
{ 
    Uri uri; 
    if (!Uri.TryCreate(url, UriKind.Absolute, out uri)) 
     uri = new Uri(SomeBaseUri, url); 

    return Path.GetFileName(uri.LocalPath); 
} 

टेस्ट परिणाम:

GetFileNameFromUrl("");           // "" 
GetFileNameFromUrl("test");          // "test.xml" 
GetFileNameFromUrl("test.xml");         // "test.xml" 
GetFileNameFromUrl("/test.xml");        // "test.xml" 
GetFileNameFromUrl("/test.xml?q=1");       // "test.xml" 
GetFileNameFromUrl("/test.xml?q=1&x=3");      // "test.xml" 
GetFileNameFromUrl("test.xml?q=1&x=3");       // "test.xml" 
GetFileNameFromUrl("http://www.a.com/test.xml?q=1&x=3");  // "test.xml" 
GetFileNameFromUrl("http://www.a.com/test.xml?q=1&x=3#aidjsf"); // "test.xml" 
GetFileNameFromUrl("http://www.a.com/a/b/c/d");     // "d" 
GetFileNameFromUrl("http://www.a.com/a/b/c/d/e/");    // "" 
8

मुझे लगता है कि यह है कि तुम क्या जरूरत है क्या करेंगे:

var uri = new Uri(hreflink); 
var filename = uri.Segments.Last(); 
0

यह मेरा नमूना है आप का उपयोग कर सकते हैं:

 public static string GetFileNameValidChar(string fileName) 
    { 
     foreach (var item in System.IO.Path.GetInvalidFileNameChars()) 
     { 
      fileName = fileName.Replace(item.ToString(), ""); 
     } 
     return fileName; 
    } 

    public static string GetFileNameFromUrl(string url) 
    { 
     string fileName = ""; 
     if (Uri.TryCreate(url, UriKind.Absolute, out Uri uri)) 
     { 
      fileName = GetFileNameValidChar(Path.GetFileName(uri.AbsolutePath)); 
     } 
     string ext = ""; 
     if (!string.IsNullOrEmpty(fileName)) 
     { 
      ext = Path.GetExtension(fileName); 
      if (string.IsNullOrEmpty(ext)) 
       ext = ".html"; 
      else 
       ext = ""; 
      return GetFileNameValidChar(fileName + ext); 

     } 

     fileName = Path.GetFileName(url); 
     if (string.IsNullOrEmpty(fileName)) 
     { 
      fileName = "noName"; 
     } 
     ext = Path.GetExtension(fileName); 
     if (string.IsNullOrEmpty(ext)) 
      ext = ".html"; 
     else 
      ext = ""; 
     fileName = fileName + ext; 
     if (!fileName.StartsWith("?")) 
      fileName = fileName.Split('?').FirstOrDefault(); 
     fileName = fileName.Split('&').LastOrDefault().Split('=').LastOrDefault(); 
     return GetFileNameValidChar(fileName); 
    } 

उपयोग:

var fileName = GetFileNameFromUrl("http://cdn.p30download.com/?b=p30dl-software&f=Mozilla.Firefox.v58.0.x86_p30download.com.zip");