21

しばらくの間、URL で機能する Path.Combine メソッドを探していました。これはURL の Path.Combine に似ていますか? 1つの大きな違いがあります。

例を挙げて説明します。ベース url:http://example.com/somefolderと file: があるとしますfoo.txt。したがって、フル パスは次のようになりますhttp://example.com/somefolder/foo.txt。シンプルですね。ハ。

私は Uri class: を試しました。Uri.TryCreate(new Uri("http://example.com/somefolder"), "foo.txt", out x);その結果、"http://example.com/foo.txt".

それから私は Path: を試しSystem.IO.Path.Combine("http://example.com/somefolder", "foo.txt");ましたが、結果は"http://example.com/somefolder\foo.txt"... Closerになりましたが、それでも違います。

キックのために、私は試してみました:System.IO.Path.Combine("http://example.com/somefolder/", "foo.txt")その結果、"http://example.com/somefolder/foo.txt".

最後のものは機能しましたが、基本的にその時点で文字列の連結を行っています。

したがって、次の 2 つのオプションがあると思います。

  • Path.Combine を使用して、すべての \ を / に置き換えます
  • 基本的な文字列連結を使用する

このための組み込みのフレームワークメソッドがありませんか?

更新:私が持っている使用例は、一連のファイルをダウンロードすることです。私のコードは次のようになります。

    public void Download()
    {
        var folder = "http://example.com/somefolder";
        var filenames = getFileNames(folder);

        foreach (var name in filenames)
        {
            downloadFile(new Uri(folder + "/" + name));
        }
    }

Uri コンストラクターで文字列 concat を使用しなければならないことと、スラッシュが必要かどうかを確認しなければならないことに腹を立てています (コードでは省略しています)。

Uri クラスは http 以外の多くのプロトコルを処理するため、私がやろうとしていることがたくさん出てくるように思えます。

4

5 に答える 5

2

この目的のための静的メソッドがあります。

// Combines urls like System.IO.Path.Combine
// Usage: this.Literal1.Text = CommonCode.UrlCombine("http://stackoverflow.com/", "/questions ", " 372865", "path-combine-for-urls");
public static string UrlCombine(params string[] urls) {
    string retVal = string.Empty;
    foreach (string url in urls)
    {
        var path = url.Trim().TrimEnd('/').TrimStart('/').Trim();
        retVal = string.IsNullOrWhiteSpace(retVal) ? path : new System.Uri(new System.Uri(retVal + "/"), path).ToString();
    }
    return retVal;

}
于 2016-05-19T02:54:34.330 に答える
2

上記の回答に近いもののLINQバージョンを次に示します。

public static string UrlCombine( this string root, params string[] parts)
{
    return parts
        .Select(part => part.Trim().TrimEnd('/').TrimStart('/').Trim())
        .Aggregate(root, (current, path) => current + ("/" + path));
}

var x = "http://domain.com";

var p = "path";

var u = x.UrlCombine(p, "test.html"); // http://domain.com/path/test.html
于 2016-07-01T19:10:44.553 に答える
-1

ああ、なぜ皆さんはそんなに複雑なコードを書くのでしょうか? それは非常に簡単です:

private string CombineUrl(params string[] urls)
{
    string result = "";

    foreach (var url in urls)
    {
        if (result.Length > 0 && url.Length > 0)
            result += '/';

        result += url.Trim('/');
    }

    return result;
}

使用例:

var methodUrl = CombineUrl("http://something.com", "/task/status/", "dfgd/", "/111", "qqq");

結果URLは「http://something.com/task/status/dfgd/111/qqq

于 2016-12-09T08:41:48.410 に答える