我有这个方法从字符串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;
}

当前回答

简单明了:

            Uri uri = new Uri(documentAttachment.DocumentAttachment.PreSignedUrl);
            fileName = Path.GetFileName(uri.LocalPath);

其他回答

你可以做一个系统。Uri对象,用IsFile验证它是文件,然后是Uri。LocalPath来提取文件名。

这要安全得多,因为它还提供了一种检查URI有效性的方法。


根据评论进行编辑:

为了得到完整的文件名,我使用:

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

这将为您执行所有的错误检查,并且与平台无关。所有的特殊情况都可以为您快速轻松地处理。

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("/", "\\"));
}

这应该处理文件名中的空格之类的内容。

Uri。IsFile不能使用http url。它只适用于“file://”。 当Scheme属性等于ur缺血efile时,IsFile属性为真。 所以你不能依赖它。

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

截至2020年,处理查询字符串和编码的url

public static string GetFileNameFromUrl (string url)
{
    var decoded = HttpUtility.UrlDecode(url);

    if (decoded.IndexOf("?") is {} queryIndex && queryIndex != -1)
    {
        decoded = decoded.Substring(0, queryIndex);
    }

    return Path.GetFileName(decoded);
}

接受的答案是有问题的http url。此外Uri。LocalPath执行Windows特定的转换,正如有人指出的那样,它将查询字符串留在那里。更好的方法是使用Uri。AbsolutePath

正确的方法来做这个http url是:

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