자주 사용하지만 인터넷에서 관련 솔루션을 찾지 못한 기능입니다.오늘은 프로젝트 응용 프로그램의 기회를 빌어 절대 경로를 가상 경로로 변환하고 이를 가상 경로로 변환하는 두 가지 방법을 작성했습니다. 지정된 페이지에 대한 상대 경로
/**//// <요약>
/// 웹사이트 아래의 절대 경로를 지정된 페이지를 기준으로 한 가상 경로로 변환합니다.
/// </summary>
/// <param name="page">현재 페이지 포인터, 일반적으로 이</param>
/// <param name="specifiedPath">절대 경로</param>
/// <returns>가상 경로, 유형: ../../</returns>
공개 정적 문자열 ConvertSpecifiedPathToRelativePathForPage(페이지 페이지, 문자열 지정 경로)
{
//루트 디렉터리 가상 경로
문자열 virtualPath = page.Request.ApplicationPath;
//루트 디렉토리의 절대 경로
string pathRooted = HostingEnvironment.MapPath(virtualPath);
//페이지 가상 경로
string pageVirtualPath = page.Request.Path;
if (!Path.IsPathRooted(specifiedPath) || 지정된Path.IndexOf(pathRooted) == -1)
{
throw new Exception(string.Format(""{0}"는 절대 경로가 아닌 가상 경로입니다!", 지정된Path));
}
// 상대 경로로 변환
//(테스트 결과 VS2005와 함께 제공되는 서버와 IIS의 루트 디렉터리 또는 가상 디렉터리에서 실행될 때 pathRooted가 다른 것으로 나타났습니다.
// 뒤에 ""를 추가하는 곳도 있고 그렇지 않은 곳도 있습니다. 그냥 안전하다고 판단하세요)
if (pathRooted.Substring(pathRooted.Length - 1, 1) == "\")
{
지정된Path = 지정된Path.Replace(pathRooted, "/");
}
또 다른
{
지정된Path = 지정된Path.Replace(pathRooted, "");
}
stringrelativePath = selectedPath.Replace("\", "/");
string[] pageNodes = pageVirtualPath.Split('/');
// 마지막 페이지와 이전 "" 값을 뺍니다.
int pageNodesCount = pageNodes.Length - 2
for (int i = 0; i < pageNodesCount; i++)
{
상대 경로 = "/.." + 상대 경로;
}
if (pageNodesCount > 0)
{
// ".."이 존재하는 경우 선행 "/"를 제거합니다.
상대 경로 = 상대 경로.하위 문자열(1, 상대 경로.길이 - 1);
}
상대 경로를 반환합니다.
}
두 번째 방법은 분명히 첫 번째 방법의 첫 번째 부분에서 추출되었으므로 관련 설명을 추가하기에는 너무 게으르다 :P
웹사이트 아래의 절대 경로를 가상 경로로 변환
/**//// <요약>
/// 웹사이트 아래의 절대 경로를 가상 경로로 변환
/// 참고: 웹 사이트가 아닌 사이트에 있는 항목은 변환되지 않습니다.
/// </summary>
/// <param name="page">현재 페이지 포인터, 일반적으로 이</param>
/// <param name="specifiedPath">절대 경로</param>
/// <returns>가상 경로, 유형: ~/</returns>
공개 정적 문자열 ConvertSpecifiedPathToRelativePath(페이지 페이지, 문자열 지정 경로)
{
string virtualPath = page.Request.ApplicationPath;
string pathRooted = HostingEnvironment.MapPath(virtualPath);
if (!Path.IsPathRooted(specifiedPath) || 지정된Path.IndexOf(pathRooted) == -1)
{
지정된 경로를 반환합니다.
}
if (pathRooted.Substring(pathRooted.Length - 1, 1) == "\")
{
지정된Path = 지정된Path.Replace(pathRooted, "~/");
}
또 다른
{
지정된Path = 지정된Path.Replace(pathRooted, "~");
}
stringrelativePath = 지정된Path.Replace("\", "/");
상대 경로를 반환합니다.
}
가상 경로를 절대 경로로 변환하는 것에 대해 말할 것도 없습니다. HttpRequest.MapPath 메서드는 이를 위해 특별히 설계되었습니다.