2010-10-13 17 views
15

caminos virtuales posibles:En C#, ¿cómo verifica si una ruta es virtual o no?

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

camino concreto:

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

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

+1

no ¿Se puede comprobar si se empieza con 'X '? – BrunoLM

Respuesta

17

Esto funciona bastante bien para mí:

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

    return Server.MapPath(path); 
} 
+3

Esto no funcionará para '/ folder1/folder2/image.jpg' que devolverá' true' – Jimbo

+0

Downvoted porque 'Path.IsPathRooted ("/folder1/folder2/image.jpg ");' returns 'true' y debería tener en cambio, devolvió 'false'; –

+0

Esto funcionará en 'algunos' casos, pero fallará en las rutas que comiencen con "/". – user1751825

1

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

Una alternativa podría ser System.IO.Path.GetPathRoot() - si devuelve null, entonces es una ruta relativa. Sin embargo, esto es algo así como un truco, ya que no sabe nada de las rutas de la web, por lo que si funciona funcionaría por coincidencia.

8

¿Se ajustaría Path.GetFullPath(string path) a sus necesidades? Puede usar ese método y luego comparar si la ruta cambió.

if (path == Path.GetFullPath(path)) 
{ 
    // This is the full path (no changes) 
} 
else 
{ 
    // This is not the full path i.e. 'virtual' (changes) 
} 

Referencia: http://msdn.microsoft.com/en-us/library/system.io.path.getfullpath.aspx

+0

soy nuevo aquí y ¿cómo puedo cancelar mi operación? –

1

La razón por la que estoy pidiendo es porque cuando uso Server.MapPath() en un camino concreto, arrojará una excepción

¿Lanza una excepción específica para este tipo de condición o arroja una genérica? Si la excepción es específica a la condición de que la ruta de entrada fue concreta, captaría esa excepción específica en su código. Incluso si es una excepción genérica, aún captaría esta excepción, es posible que no pueda decodificar si fue lanzada porque la ruta de entrada era virtual, pero al menos puede escribir su propio mensaje de excepción que incluya un aviso de que podría ser causado por la ruta de entrada siendo 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 en las que falla, en lugar de tratar de crear un contenedor redundante que intenta hacer lo mismo . En el futuro, la funcionalidad de MapPath() puede cambiar y, de hecho, puede comenzar a admitir rutas virtuales, entonces sería una tontería tener un código para evitar ese uso.

1

Puede utilizar la siguiente expresión regular ...

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

Si desea asegurarse de que siempre tiene un camino trazado. Puede usar el siguiente delineador ...

VB.Net

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

C#

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

Esto debería funcionar correctamente con rutas de unidades regulares "c: \", así como rutas UNC "\\".

0

// 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

+0

Esto se puede lograr mucho más fácilmente con una expresión regular. Una expresión regular puede hacer exactamente lo mismo en 1 línea. – user1751825

Cuestiones relacionadas