Uma função que é frequentemente usada, mas nunca encontrei uma solução relevante na Internet. Hoje aproveitei a oportunidade do aplicativo do projeto para escrever dois métodos para converter caminhos absolutos em caminhos virtuais e encapsulá-los. caminho relativo à página especificada
/**//// <resumo>
/// Converte o caminho absoluto do site em um caminho virtual relativo à página especificada
/// </sumário>
/// <param name="page">Ponteiro da página atual, geralmente este</param>
/// <param name="specifiedPath">Caminho absoluto</param>
/// <returns>Caminho virtual, digite: ../../</returns>
string estática pública ConvertSpecifiedPathToRelativePathForPage (Página página, string especificadaPath)
{
//Caminho virtual do diretório raiz
string virtualPath = page.Request.ApplicationPath;
//Caminho absoluto para o diretório raiz
string pathRooted = HostingEnvironment.MapPath(virtualPath);
//Caminho virtual da página
string pageVirtualPath = page.Request.Path;
if (!Path.IsPathRooted(specifiedPath) ||specificPath.IndexOf(pathRooted) == -1)
{
throw new Exception(string.Format(""{0}"é um caminho virtual, não um caminho absoluto!", especificadoPath));
}
// Converte para caminho relativo
//(O teste descobriu que pathRooted parece ser diferente quando executado no servidor que acompanha o VS2005 e no diretório raiz ou diretório virtual no IIS.
// Alguns lugares adicionarão "" depois, outros não, apenas faça uma avaliação para estar no lado seguro)
if (pathRooted.Substring(pathRooted.Length - 1, 1) == "\")
{
caminho especificado = caminho especificado.Replace(pathRooted, "/");
}
outro
{
caminho especificado = caminho especificado.Replace(pathRooted, "");
}
string relativoPath = especificadoPath.Replace("\", "/");
string[] pageNodes = pageVirtualPath.Split('/')
;
int pageNodesCount = pageNodes.Length - 2
para (int i = 0; i < pageNodesCount; i++)
{
relativoPath = "/.." + relativoPath;
}
if (pageNodesCount > 0)
{
// Se ".." existir, remova o "/" inicial
relativoPath = relativoPath.Substring(1, relativoPath.Length - 1);
}
return CaminhoRelativo;
}
O segundo método é obviamente extraído da primeira parte do primeiro método, então estou com preguiça de adicionar comentários relevantes :P
Converta o caminho absoluto do site em um caminho virtual
/**//// <resumo>
/// Converte o caminho absoluto do site em um caminho virtual
/// Nota: Aqueles em sites que não sejam da Web não serão convertidos.
/// </sumário>
/// <param name="page">Ponteiro da página atual, geralmente este</param>
/// <param name="specifiedPath">Caminho absoluto</param>
/// <returns>Caminho virtual, digite: ~/</returns>
string estática pública ConvertSpecifiedPathToRelativePath (Página página, string especificadaPath)
{
string virtualPath = page.Request.ApplicationPath;
string pathRooted = HostingEnvironment.MapPath(virtualPath)
;
{
return caminho especificado;
}
if (pathRooted.Substring(pathRooted.Length - 1, 1) == "\")
{
caminho especificado = caminho especificado.Replace(pathRooted, "~/");
}
outro
{
caminho especificado = caminho especificado.Replace(pathRooted, "~");
}
string caminho relativo = caminho especificado.Replace("\", "/");
retornar caminho relativo;
}
Não há nada a dizer sobre a conversão de um caminho virtual em um caminho absoluto. O método HttpRequest.MapPath foi projetado especificamente para fazer isso.