Un MapPath() plus souple
2006-03-14 #.net#qc
La méthode MapPath() renvoie le chemin d'accès physique qui correspond à l'url qui lui est passé en argument.
Le problème est que Server.MapPath() n'accepte que les répertoires virtuels comme paramètre, qu'il s'agisse d'une url absolue (here/myfile.txt) ou relative (../yourdir/yourfile.txt) ou même d'une url commençant par un tilde (~/ourdir/ourfile.txt).
Mais elle provoque une erreur dès que son argument est une url complète (http://www.example.com/mydir/myfile.txt) ou correspond déjà à une adresse physique (D:\websites\example.com\mydir\myfile.txt).
Pour simplifier l'utilisation de la méthode MapPath() et éviter de tester ses arguments à chaque appel, ajout d'une méthode MapPath() améliorée à la classe Common.cs. :
///<summary>
/// Same as Server.MapPath but don't hang on physical path
///</summary>
public static string MapPath (string path) {
string temp = path;
try {
temp = System.Web.HttpContext.Current.Server.MapPath(path);
} catch (Exception ex) {
try {
System.Uri utemp = new System.Uri(path);
if (utemp.IsFile == true) {
temp = utemp.LocalPath;
} else {
temp = System.Web.HttpContext.Current.Server.MapPath(utemp.LocalPath);
}
} catch {
throw ex;
}
}
return (temp);
}
Màj du 19/03 : gère le cas où l'url passée en argument comprend des paramètres (here/myflash.swf?file=test.mp3).
public static string MapPath (string path) {
string temp = path + "?";
temp = temp.Split('?')[0];
try {
temp = Context.Server.MapPath(temp);
} catch (Exception ex) {
try {
Uri utemp = new Uri(temp);
if (utemp.IsFile == true) {
temp = utemp.LocalPath;
} else {
temp = Context.Server.MapPath(utemp.LocalPath);
}
} catch {
throw ex;
}
}
return (temp);
}