2009-09-09 13 views
64

Comment convertir un chemin relatif en un chemin absolu dans une application Windows?Comment convertir un chemin relatif en un chemin absolu dans une application Windows?

Je sais que nous pouvons utiliser server.MapPath() dans ASP.NET. Mais que pouvons-nous faire dans une application Windows?

Je veux dire, s'il y a une .NET fonction intégrée qui peut gérer que ...

+1

Voulez-vous dire un chemin relatif vers le répertoire en cours, en d'autres termes le répertoire de travail, ou par rapport à l'emplacement du fichier .exe? –

+1

Il existe deux types de chemins relatifs. Un si de la forme "A \ B \ C" et n'implique pas une base particulière. L'autre a la forme ". \ A \ B" ou ".. \ A \ B"; ceux-ci sont relatifs au répertoire de travail actuel. – MSalters

+0

@Amit Dhall: Soit dit en passant, c'est une bonne chose d'accepter et d'upvote la réponse (s) qui vous aident. –

Répondre

129

Avez-vous essayé:

string absolute = Path.GetFullPath(relative); 

? Notez que cela utilisera le répertoire de travail actuel du processus, pas le répertoire contenant l'exécutable. Si cela ne vous aide pas, veuillez clarifier votre question.

+2

Cela ne dépendrait-il pas de l'endroit où vous démarrez l'application, ne dépendant pas de l'emplacement de l'exe? Certes, la question n'est pas vraiment claire à ce sujet. –

+0

Comme vous le dites, la question n'est pas claire. GetFullPath va résoudre à partir du répertoire de travail en cours. Je vais modifier ma réponse pour l'indiquer. –

+0

Si une application est démarrée via l'Explorateur Windows, il semble que le répertoire en cours et le répertoire d'exécution sont les mêmes (au moins jusqu'à ce que quelque chose soit fait pour les rendre différents). Cela est vrai même si vous utilisez un raccourci vers l'exécutable où le raccourci réside quelque part complètement différent. – H2ONaCl

17

Si vous voulez obtenir le chemin par rapport à votre .exe puis utilisez

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

Ou, plus généralement, Path.Combine (myBasePath, relatif) ... –

+3

Faites juste attention à Path.Combine. Si la partie 'relative' commence par une barre oblique, il se peut qu'elle ne fasse pas ce que vous pensez. –

+1

@silky: eh bien, alors ce n'est pas relatif, n'est-ce pas? –

11

Celui-ci travaille pour les chemins sur les différents lecteurs, pour les chemins d'entraînement-apparenté et les chemins réels relatifs. Heck, cela fonctionne même si le basePath n'est pas réellement absolu; Il utilise toujours le répertoire de travail en cours comme solution de secours finale.

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

Excellente solution car elle combine un chemin absolu ou apparenté selon un chemin de base. À mon avis, l'argument relatifPath devrait être renommé en AbsoluteOrRelativePath, car c'est ce qu'il représente réellement. Merci –

+0

Eh bien, si c'est déjà un chemin absolu, c'est juste un cas particulier, vraiment ... la fonction est toujours destinée à résoudre les chemins relatifs, lol. Je viens de le nommer ici pour préciser quel paramètre est;) – Nyerguds

+0

@JulioNobre d'autant plus que les arguments ici sont inversés par rapport à 'Path.Combine'. Cela est facilement corrigé, mais je l'évite puisque je l'utilise souvent pour résoudre les chemins relatifs sur le répertoire de travail, et donner null comme premier arg semble bizarre. – Nyerguds

Questions connexes