给定绝对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);
}
谢谢, 罗希特夏尔
答案 0 :(得分:31)
Uri parent = new Uri(uri, "..");
答案 1 :(得分:29)
这是我能想到的最短时间:
static string GetParentUriString(Uri uri)
{
return uri.AbsoluteUri.Remove(uri.AbsoluteUri.Length - uri.Segments.Last().Length);
}
如果要使用Last()方法,则必须包含System.Linq。
答案 2 :(得分:7)
使用内置的uri方法必须有一个更简单的方法来做到这一点,但这是我对@unknown(雅虎)的建议的转折。
在此版本中,您不需要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);
}
答案 3 :(得分:1)
快速而肮脏
int pos = uriString.LastIndexOf('/');
if (pos > 0) { uriString = uriString.Substring(0, pos); }
答案 4 :(得分:1)
我找到的最短路:
static Uri GetParent(Uri uri) {
return new Uri(uri, Path.GetDirectoryName(uri.LocalPath) + "/");
}
答案 5 :(得分: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;
}
注意:它会故意删除查询和碎片。
答案 6 :(得分:0)
new Uri(uri.AbsoluteUri + "/../")
答案 7 :(得分:0)
PapyRef的回答不正确,UriPartial.Path
包含文件名。
new Uri(uri, ".").ToString()
似乎是所请求函数的最干净/最简单的实现。
答案 8 :(得分:0)
获取网址分段
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("/"))
这会让我回复,#34; Common&#34;
答案 9 :(得分: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
我不能说我已经测试过每一个场景,所以建议谨慎。