Une fonction souvent utilisée, mais je n'ai jamais trouvé de solution pertinente sur Internet. Aujourd'hui, j'ai profité d'une application de projet pour écrire deux méthodes permettant de convertir des chemins absolus en chemins virtuels et de les encapsuler. chemin relatif à la page spécifiée
/**//// <résumé>
/// Convertit le chemin absolu sous le site Web en un chemin virtuel relatif à la page spécifiée
/// </summary>
/// <param name="page">Pointeur de page actuelle, généralement celui-ci</param>
/// <param name="specifiedPath">Chemin absolu</param>
/// <returns>Chemin virtuel, tapez : ../../</returns>
chaîne statique publique ConvertSpecifiedPathToRelativePathForPage (page de page, chaîne spécifiéePath)
{
//Chemin virtuel du répertoire racine
chaîne virtualPath = page.Request.ApplicationPath ;
//Chemin absolu vers le répertoire racine
chaîne pathRooted = HostingEnvironment.MapPath(virtualPath);
//Chemin virtuel de la page
chaîne pageVirtualPath = page.Request.Path;
if (!Path.IsPathRooted(specifiedPath) || spécifiéPath.IndexOf(pathRooted) == -1)
{
throw new Exception(string.Format(""{0}"est un chemin virtuel et non un chemin absolu !", spécifiéPath));
}
// Convertir en chemin relatif
//(Le test a révélé que pathRooted semble être différent lorsqu'il est exécuté sur le serveur fourni avec VS2005 et dans le répertoire racine ou le répertoire virtuel sous IIS.
// Certains endroits ajouteront "" après, d'autres non, il suffit de porter un jugement pour être prudent)
if (pathRooted.Substring(pathRooted.Length - 1, 1) == "\")
{
spécifiéPath = spécifiéPath.Replace(pathRooted, "/");
}
autre
{
spécifiéPath = spécifiéPath.Replace(pathRooted, "");
}
string relativePath = spécifiéPath.Replace("\", "/");
string[] pageNodes = pageVirtualPath.Split('/');
// Soustraire la dernière page et la valeur "" précédente
int pageNodesCount = pageNodes.Length - 2;
pour (int i = 0; i < pageNodesCount; i++)
{
cheminrelatif = "/.." + cheminrelatif ;
}
si (pageNodesCount > 0)
{
// Si ".." existe, supprimez le "/" initial
relativePath = relativePath.Substring(1, relativePath.Length - 1);
}
return chemin relatif ;
}
La deuxième méthode est évidemment extraite de la première partie de la première méthode, j'ai donc la flemme d'ajouter des commentaires pertinents :P
Convertir le chemin absolu sous le site Web en chemin virtuel
/**//// <résumé>
/// Convertir le chemin absolu sous le site Web en chemin virtuel
/// Remarque : Ceux sous des sites non Web ne seront pas convertis.
/// </summary>
/// <param name="page">Pointeur de page actuelle, généralement celui-ci</param>
/// <param name="specifiedPath">Chemin absolu</param>
/// <returns>Chemin virtuel, tapez : ~/</returns>
chaîne statique publique ConvertSpecifiedPathToRelativePath (page de page, chaîne spécifiéePath)
{
string virtualPath = page.Request.ApplicationPath;
string pathRooted = HostingEnvironment.MapPath(virtualPath);
if (!Path.IsPathRooted(specifiedPath) || selectedPath.IndexOf(pathRooted) == -1)
{
renvoie le chemin spécifié ;
}
if (pathRooted.Substring(pathRooted.Length - 1, 1) == "\")
{
spécifiéPath = spécifiéPath.Replace(pathRooted, "~/");
}
autre
{
spécifiéPath = spécifiéPath.Replace(pathRooted, "~");
}
chaîne relativePath = chemin spécifié.Replace("\", "/");
retourner chemin relatif ;
}
Il n'y a rien à dire sur la conversion d'un chemin virtuel en chemin absolu. La méthode HttpRequest.MapPath est spécialement conçue pour cela.