2009-09-09 46 views
64

¿Cómo convierto una ruta relativa a una ruta absoluta en una aplicación de Windows?¿Cómo convertir una ruta relativa a una ruta absoluta en una aplicación de Windows?

Sé que podemos usar server.MapPath() en ASP.NET. Pero, ¿qué podemos hacer en una aplicación de Windows?

Es decir, si hay una función incorporada que puede manejar eso .NET ...

+1

¿Se refiere a una ruta relativa al directorio actual, es decir, el directorio de trabajo, o en relación con la ubicación del archivo .exe? –

+1

Hay dos tipos de rutas relativas. Uno si tiene la forma "A \ B \ C" y no implica una base particular. El otro tiene la forma ". \ A \ B" o ".. \ A \ B"; esos son relativos al directorio de trabajo actual. – MSalters

+0

@Amit Dhall: Por cierto, es bueno aceptar y votar la (s) respuesta (s) que lo ayuden. –

Respuesta

129

¿Has probado:

string absolute = Path.GetFullPath(relative); 

? Tenga en cuenta que usará el directorio de trabajo actual del proceso, no el directorio que contiene el ejecutable. Si eso no ayuda, aclare su pregunta.

+2

¿No sería eso dependiendo de dónde iniciaste la aplicación, no dependiendo de dónde esté ubicado el administrador? De acuerdo, la pregunta no es muy clara al respecto. –

+0

Como dices, la pregunta no está clara. GetFullPath se resolverá desde el directorio de trabajo actual. Editaré mi respuesta para indicar esto. –

+0

Si se inicia una aplicación a través del Explorador de Windows, parece que el directorio actual y el directorio del ensamblaje en ejecución son los mismos (al menos hasta que se haga algo para que sean diferentes). Esto es cierto incluso si usa un atajo para el ejecutable donde el atajo reside en un lugar completamente diferente. – H2ONaCl

17

Si desea obtener la ruta relativa a su .exe a continuación, utilizar

string absolute = Path.Combine(Application.ExecutablePath, relative); 
+1

O, más generalmente, Path.Combine (myBasePath, relativo) ... –

+3

Solo tenga cuidado con Path.Combine. Si la parte 'relativa' comienza con una barra inclinada, puede que no haga lo que crees que sucedería. –

+1

@silky: bueno, entonces no es relativo, ¿o sí? –

11

Esta funciona de caminos en diferentes dispositivos, para rutas de unidad-relativo y para las rutas relativas reales. Diablos, incluso funciona si el basePath no es realmente absoluto; siempre usa el directorio de trabajo actual como respaldo final.

public static String GetAbsolutePath(String relativePath, String basePath) 
{ 
    if (relativePath == null) 
     return null; 
    if (basePath == null) 
     basePath = Path.GetFullPath("."); // quick way of getting current working directory 
    else 
     basePath = GetAbsolutePath(basePath, null); // to be REALLY sure ;) 
    String path; 
    // specific for windows paths starting on \ - they need the drive added to them. 
    // I constructed this piece like this for possible Mono support. 
    if (!Path.IsPathRooted(relativePath) || "\\".Equals(Path.GetPathRoot(relativePath))) 
    { 
     if (relativePath.StartsWith(Path.DirectorySeparatorChar.ToString())) 
      path = Path.Combine(Path.GetPathRoot(basePath), relativePath.TrimStart(Path.DirectorySeparatorChar)); 
     else 
      path = Path.Combine(basePath, relativePath); 
    } 
    else 
     path = relativePath; 
    // resolves any internal "..\" to get the true full path. 
    return Path.GetFullPath(path); 
} 
+0

Gran solución porque combina la ruta absoluta o relativa de acuerdo con una ruta base. En mi opinión, el argumento relativePath debe renombrarse a AbsoluteOrRelativePath, ya que es lo que realmente representa. Gracias –

+0

Bueno, si ya es una ruta absoluta, eso es solo un caso especial, realmente ... la función todavía está destinada a resolver rutas relativas, jajaja. Acabo de nombrarlo aquí para aclarar qué parámetro es cuál;) – Nyerguds

+0

@JulioNobre especialmente porque los argumentos aquí están invertidos en comparación con 'Path.Combine'. Eso se soluciona fácilmente, pero lo evito, ya que a menudo lo uso para resolver rutas relativas en el directorio de trabajo, y dar nulo como primer arg parece extraño. – Nyerguds

Cuestiones relacionadas