C # में URI स्ट्रिंग से फ़ाइल नाम प्राप्त करें


206

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

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;
}

जवाबों:


388

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

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


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

बस पूरा नाम पाने के लिए, मैं उपयोग करूँगा:

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

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


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

2
सही है, लेकिन मुझे केवल फ़ाइल नाम की आवश्यकता है, संपूर्ण फ़ाइल पथ की नहीं। क्या मैं अभी भी उरी.लोकपथ पर उस कदम को करने के लिए नहीं बचा हूं?
१०:४० बजे

2
@paulwhit: उस स्थिति में, आपको Uri.LocalPath के परिणामों पर Path.GetFileName का उपयोग करना चाहिए। यह पूरी तरह से सुरक्षित है, इसे संभालने का अत्यधिक जाँच तरीका है। इसे शामिल करने के लिए मैं अपने उत्तर को संपादित करूंगा। देखें: msdn.microsoft.com/en-us/library/…
रीड

49
isFile केवल योजना को देखता है। तो: " www / myFile.jpg " गलत देता है, "फ़ाइल: //www/something.jpg" सही है, इसलिए यह इस मामले में बेकार है।
dethwatch

6
एक querystring से भी सावधान रहें। http://www.test.com/file1.txt?a=bपरिणाम होगाfile1.txt?a=b
जूलियन

75

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

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

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

जब आप Uri.IsFileकिसी http URL / योजना पर परीक्षण करने के लिए उपयोग नहीं कर सकते , तो आप http URL से फ़ाइल नाम को सफलतापूर्वक निकाल सकते हैंSystem.IO.Path.GetFileName(url);
एलेक्स पांड्रिया

50

अधिकांश अन्य उत्तर या तो अपूर्ण हैं या पथ (क्वेरी स्ट्रिंग / हैश) के बाद आने वाले सामान के साथ सौदा नहीं करते हैं।

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"
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/");              // ""

7
या तो GetFileNameFromUrl("test")परिणाम क्यों होगा "test.xml"कि सिर्फ एक टाइपो?
ckittel

27

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

Http यूआरएल के लिए ऐसा करने का सही तरीका है:

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

7
ध्यान दें कि http://example.com/dir/hello%20world.txtइस तरह से बच गए यूआरएल के लिए वापस आ जाएगा hello%20world.txtजबकि Uri.LocalPathदृष्टिकोण वापस आ जाएगाhello world.txt
जेफ़ मोसर

22

मुझे लगता है कि यह वही करेगा जो आपको चाहिए:

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

2
यह वास्तव में एक सुरुचिपूर्ण समाधान की तरह दिखता है, लेकिन बस यह ध्यान रखें कि यह केवल पूर्ण यूआरआई पर काम करता है और एक एन्कोडेड / एस्केपेड मान ( Uri.UnescapeDataString()% 20 और + स्थान को बदलने के लिए उपयोग ) देता है।
रोनाल्ड

8
using System.IO;

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

निश्चित रूप से, यह माना जाता है कि आपने फ़ाइल का नाम छोड़ दिया है।

EDIT # 2:

using System.IO;

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

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


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

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

2

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

        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");

0

सरल और सीधे आगे:

            Uri uri = new Uri(documentAttachment.DocumentAttachment.PreSignedUrl);
            fileName = Path.GetFileName(uri.LocalPath);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.