Webフォームで生成されているasp.net URLパスがあり、「/ foo/bar/../bar/path.aspx」のようなものが出てきて、このように生成されたhtmlでも出てきます. 「/foo/bar/path.aspx」に短縮する必要があります。
Path.Combine では修正されませんでした。このパスをクリーンアップする機能はありますか?
System.Net で UriBuilder クラスをラップするヘルパー クラスを作成できます。
public static class UriHelper
{
public static string NormalizeRelativePath(string path)
{
UriBuilder _builder = new UriBuilder("http://localhost");
builder.Path = path;
return builder.Uri.AbsolutePath;
}
}
これは次のように使用できます。
string url = "foo/bar/../bar/path.aspx";
Console.WriteLine(UriHelper.NormalizeRelativePath(url));
少しハックですが、あなたが与えた特定の例ではうまくいきます。
編集: アンドリューのコメントを反映するように更新されました。
何をするにしても、静的なUriBuilderを使用しないでください。これにより、高負荷になるまで検出できない可能性のあるあらゆる種類の潜在的な競合状態が発生します。
2つの異なるスレッドが同時にUriHelper.NormalizeRelativePathを呼び出した場合、一方の戻り値をもう一方の呼び出し元に任意に返すことができます。
UriBuilderを使用してこれを行う場合は、必要なときに新しいものを作成するだけです(作成するのに費用はかかりません)。
皮肉屋の回答は私の回答よりもはるかに優れていますが、ファイルシステムのパスを扱っている場合は、以下の私の醜いハックも役立つことが判明する可能性があります。(訳:私が打ち込んだので、投稿しないとだめです :)
Path.Combine は、先頭または末尾のスラッシュに注意して、2 つの文字列を結合するだけです。私の知る限り、正規化を行う唯一の Path メソッドは Path.GetFullPath です。以下は、「クリーンアップ」バージョンを提供します。
myPath = System.IO.Path.GetFullPath(myPath);
もちろん、結果のパスがルート化され、スラッシュがバックスラッシュに変換されるという小さな問題があります (「C:\foo\bar\path.aspx」など)。ただし、元のパスの親ルートがわかっている場合は、ルートを削除しても大きな問題にはなりません。