it-swarm.com.de

Abrufen des Dateinamens von der URI-Zeichenfolge in C #

Ich habe diese Methode zum Abrufen des Dateinamens von einem String-URI. Was kann ich tun, um es robuster zu machen?

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

Sie können einfach ein System.Uri-Objekt erstellen und mit IsFile überprüfen, ob es sich um eine Datei handelt. Anschließend können Sie mit ri.LocalPath den Dateinamen extrahieren.

Dies ist viel sicherer, da Sie damit auch die Gültigkeit der URI überprüfen können.


Als Antwort auf einen Kommentar bearbeiten:

Um nur den vollständigen Dateinamen zu erhalten, würde ich Folgendes verwenden:

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

Dies erledigt die gesamte Fehlerprüfung für Sie und ist plattformneutral. Alle Sonderfälle werden schnell und einfach für Sie bearbeitet.

367
Reed Copsey

Uri.IsFile funktioniert nicht mit http-URLs. Es funktioniert nur für "file: //". From MSDN : "Die IsFile-Eigenschaft ist true , wenn die Scheme-Eigenschaft gleich UriSchemeFile ist . " Darauf können Sie sich also nicht verlassen.

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

Die meisten anderen Antworten sind entweder unvollständig oder befassen sich nicht mit Dingen, die nach dem Pfad kommen (Abfragezeichenfolge/Hash).

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

Testergebnisse:

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

Die akzeptierte Antwort ist für http-URLs problematisch. Außerdem Uri.LocalPath führt Windows-spezifische Konvertierungen durch, und wie jemand darauf hingewiesen hat, werden darin Abfragezeichenfolgen belassen. Ein besserer Weg ist es, Uri.AbsolutePath

Die korrekte Vorgehensweise für http-URLs lautet:

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

Ich denke, das wird tun, was Sie brauchen:

var uri = new Uri(hreflink);
var filename = uri.Segments.Last();
17
Zeus82
using System.IO;

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

Dies setzt natürlich voraus, dass Sie den Dateinamen analysiert haben.

EDIT # 2:

using System.IO;

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

Dies sollte Leerzeichen und dergleichen im Dateinamen behandeln.

7
Mike Hofer

dies ist mein Beispiel, das Sie verwenden können:

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

Verwendung:

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