21

给定一个绝对 URI/URL,我想得到一个不包含叶子部分的 URI/URL。例如:给定http://foo.com/bar/baz.html,我应该得到http://foo.com/bar/

我能想出的代码似乎有点冗长,所以我想知道是否有更好的方法。

static string GetParentUriString(Uri uri)
    {            
        StringBuilder parentName = new StringBuilder();

        // Append the scheme: http, ftp etc.
        parentName.Append(uri.Scheme);            

        // Appned the '://' after the http, ftp etc.
        parentName.Append("://");

        // Append the host name www.foo.com
        parentName.Append(uri.Host);

        // Append each segment except the last one. The last one is the
        // leaf and we will ignore it.
        for (int i = 0; i < uri.Segments.Length - 1; i++)
        {
            parentName.Append(uri.Segments[i]);
        }
        return parentName.ToString();
    }

一个人会使用这样的功能:

  static void Main(string[] args)
    {            
        Uri uri = new Uri("http://foo.com/bar/baz.html");
        // Should return http://foo.com/bar/
        string parentName = GetParentUriString(uri);                        
    }

谢谢,罗希特

4

10 回答 10

37

你试过这个吗?看起来很简单。

Uri parent = new Uri(uri, "..");
于 2011-02-17T04:18:29.760 回答
32

这是我能想到的最短的:

static string GetParentUriString(Uri uri)
{
    return uri.AbsoluteUri.Remove(uri.AbsoluteUri.Length - uri.Segments.Last().Length);
}

如果要使用 Last() 方法,则必须包含 System.Linq。

于 2009-02-04T06:09:26.980 回答
8

必须有一种更简单的方法可以使用内置的 uri 方法来执行此操作,但这是我对 @unknown (yahoo) 建议的看法。
在这个版本中你不需要System.Linq它,它还处理带有查询字符串的 URI:

private static string GetParentUriString(Uri uri)
{
    return uri.AbsoluteUri.Remove(uri.AbsoluteUri.Length - uri.Segments[uri.Segments.Length -1].Length - uri.Query.Length);
}
于 2009-05-21T06:20:22.417 回答
1

又快又脏

int pos = uriString.LastIndexOf('/');
if (pos > 0) { uriString = uriString.Substring(0, pos); } 
于 2009-02-04T06:12:16.303 回答
1

我发现的最短方法:

static Uri GetParent(Uri uri) {
    return new Uri(uri, Path.GetDirectoryName(uri.LocalPath) + "/");
}
于 2010-04-13T18:27:08.857 回答
1

PapyRef 的答案不正确,UriPartial.Path包括文件名。

new Uri(uri, ".").ToString()

似乎是请求功能的最干净/最简单的实现。

于 2013-08-08T00:38:45.090 回答
1

我在这里阅读了很多答案,但没有找到我喜欢的答案,因为它们在某些情况下会中断。

所以,我正在使用这个:

public Uri GetParentUri(Uri uri) {
    var withoutQuery = new Uri(uri.GetComponents(UriComponents.Scheme |
                                                 UriComponents.UserInfo |
                                                 UriComponents.Host |
                                                 UriComponents.Port |
                                                 UriComponents.Path, UriFormat.UriEscaped));
    var trimmed = new Uri(withoutQuery.AbsoluteUri.TrimEnd('/'));
    var result = new Uri(trimmed, ".");
    return result;
}

注意:它会故意删除查询和片段。

于 2016-07-22T11:43:58.003 回答
0
new Uri(uri.AbsoluteUri + "/../")
于 2011-03-10T18:26:18.743 回答
0

获取 url 的分段

url="http://localhost:9572/School/Common/Admin/Default.aspx"

Dim name() As String = HttpContext.Current.Request.Url.Segments

now simply using for loop or by index, get parent directory name

code = name(2).Remove(name(2).IndexOf("/"))

这让我回到“普通”

于 2015-05-07T06:01:39.243 回答
0

以为我会插话;尽管已经将近 10 年了,但随着云的出现,获取父 Uri 是一个相当普遍(并且 IMO 更有价值)的场景,因此在这里结合一些答案,您只需使用(扩展)Uri 语义:

public static Uri Parent(this Uri uri)
{
    return new Uri(uri.AbsoluteUri.Remove(uri.AbsoluteUri.Length - uri.Segments.Last().Length - uri.Query.Length).TrimEnd('/'));
}

var source = new Uri("https://foo.azure.com/bar/source/baz.html?q=1");

var parent = source.Parent();         // https://foo.azure.com/bar/source
var folder = parent.Segments.Last();  // source

我不能说我已经测试了所有场景,所以建议谨慎。

于 2018-06-11T13:35:22.697 回答