servermap net ejemplos asp c# asp.net file path

c# - ejemplos - servermap asp net



En C#, ¿cómo verifica si una ruta es virtual o no? (6)

La razón por la que pregunto es porque cuando uso Server.MapPath () en una ruta concreta, se lanzará una excepción.

¿Lanza una excepción específica para este tipo de condición, o lanza una genérica? Si la excepción es específica a la condición de que la ruta de entrada sea concreta, detectaría esa excepción específica en su código. Incluso si se trata de una excepción genérica, aún así podría detectar esta excepción, es posible que no pueda decodificar si se lanzó porque la ruta de entrada era virtual, pero al menos puede escribir su propio mensaje de excepción, incluido un aviso de que podría haber sido siendo la ruta de entrada virtual.

Creo que esta es la solución menos propensa a errores porque confía en la implementación de Server.MapPath () para determinar las condiciones bajo las cuales falla, en lugar de intentar crear un contenedor redundante que intenta hacer lo mismo. En el futuro, la funcionalidad de MapPath () puede cambiar y puede comenzar a admitir rutas virtuales, por lo que sería una tontería que tenga un código para evitar ese uso.

Posibles caminos virtuales:

/folder1/folder2/image.jpg ~/folder1/folder2/image.jpg folder1/folder2/image.jpg

Camino de concreto

C:/folder1/folder2/image.jpg D:/folder1/folder2/image.jpg C:/folder1/folder2/image.jpg C:/folder1/folder2/image.jpg

¿Cómo verifica si una ruta es virtual o no de una manera que no sea propensa a fallar? La razón por la que pregunto es porque cuando uso Server.MapPath() en una ruta concreta, se producirá una excepción. Sin embargo, lo que estoy pasando a Server.MapPath() puede ser cualquiera de los ejemplos que proporcioné anteriormente y no sé qué es antes del tiempo de ejecución.



// Path.IsPathRooted ("/ folder1 / folder2 / image.jpg"); devuelve verdadero

public void Main() { var path = @"/folder1/folder2/image.jpg"; //is valid path? if (!System.IO.Path.GetInvalidPathChars().Any(c => path.Contains(c.ToString()))) { if (IsAbsolutePhysicalPath(path)) { // This is the full path } else { // This is not the full path } } } private bool IsAbsolutePhysicalPath(string path) { if (path == null || path.Length < 3) return false; // e.g c:/foo if (path[1] == '':'' && IsDirectorySeparatorChar(path[2])) return true; // e.g //server/share/foo or //server/share/foo return IsUncSharePath(path); } private bool IsDirectorySeparatorChar(char ch) { return (ch == ''//' || ch == ''/''); } private bool IsUncSharePath(string path) { // e.g //server/share/foo or //server/share/foo if (path.Length > 2 && IsDirectorySeparatorChar(path[0]) && IsDirectorySeparatorChar(path[1])) return true; return false; }

Referencia: http://referencesource.microsoft.com/#System.Web/Util/UrlPath.cs,5e5cf20a50a858e2


Esto funciona lo suficientemente bien para mí:

protected string GetPath(string path) { if (Path.IsPathRooted(path)) { return path; } return Server.MapPath(path); }


Puedes usar el siguiente regex ...

^(?:[a-zA-Z]:(?://|/)|////)

Si desea asegurarse de que siempre tiene una ruta asignada. Puedes usar la siguiente frase de una sola línea ...

VB.Net

my_path = If(Regex.IsMatch(my_path, "^(?:[a-zA-Z]:(?://|/)|////)"), my_path, Server.MapPath(my_path))

DO#

my_path = Regex.IsMatch(my_path, @"^(?:[a-zA-Z]:(?://|/)|////)") ? my_path : Server.MapPath(my_path);

Esto debería funcionar correctamente con las rutas de disco normales "c: /", así como con las rutas UNC "//".


Yo usaría Reflector para verificar qué hace Server.MapPath() y hacer eso. :)

Una alternativa podría ser System.IO.Path.GetPathRoot() : si devuelve un null , es una ruta relativa. Sin embargo, esto es un poco pirateado, ya que no sabe nada acerca de las rutas web, por lo que si funciona, funcionaría por coincidencia.