문제
웹 양식에서 생성되는 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));
약간 해키지만 제공한 특정 예에서는 작동합니다.
편집하다:Andrew의 의견을 반영하여 업데이트되었습니다.
다른 팁
무엇을 하든 정적 UriBuilder를 사용하지 마세요.이로 인해 과부하가 걸릴 때까지 감지할 수 없는 모든 종류의 잠재적인 경쟁 조건이 발생합니다.
두 개의 서로 다른 스레드가 동시에 UriHelper.NormalizeRelativePath를 호출하는 경우 하나의 반환 값이 다른 호출자에게 임의로 다시 전달될 수 있습니다.
UriBuilder를 사용하여 이 작업을 수행하려면 필요할 때 새로 생성하면 됩니다(생성 비용이 많이 들지 않음).
Sarcastic의 답변은 저보다 훨씬 낫습니다. 하지만 파일 시스템 경로로 작업하는 경우에는 아래의 추악한 해킹 유용할 수도 있습니다.(번역:제가 직접 쓴 글이라 안 올리면 낭패입니다 :)
Path.Combine은 선행 또는 후행 슬래시에 주의하면서 두 문자열을 함께 칩니다.내가 아는 한 정규화를 수행하는 유일한 Path 메서드는 Path.GetFullPath입니다.다음은 "정리된" 버전을 제공합니다.
myPath = System.IO.Path.GetFullPath(myPath);
물론, 결과 경로가 루팅되고 슬래시가 백슬래시로 변환된다는 작은 문제가 있습니다(예: "C:\foo\bar\path.aspx").그러나 원래 경로의 상위 루트를 알고 있다면 루트를 제거하는 것은 큰 문제가 되지 않습니다.