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

ありがとう、Rohit

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

私が見つけた最短の方法:

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

速くて汚い

int pos = uriString.LastIndexOf('/');
if (pos > 0) { uriString = uriString.Substring(0, pos); } 
于 2009-02-04T06:12:16.303 に答える
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

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
new Uri(uri.AbsoluteUri + "/../")
于 2011-03-10T18:26:18.743 に答える