2009-09-09 8 views
64

Jak przekonwertować ścieżkę względną na ścieżkę bezwzględną w aplikacji systemu Windows?Jak przekonwertować ścieżkę względną na ścieżkę bezwzględną w aplikacji systemu Windows?

Wiem, że możemy użyć server.MapPath() w ASP.NET. Ale co możemy zrobić w aplikacji Windows?

To znaczy, jeśli istnieje .NET wbudowaną funkcją, która może sobie z tym poradzić ...

+1

Masz na myśli względną ścieżkę do bieżącego katalogu, innymi słowy katalog roboczy lub lokalizację pliku .exe? –

+1

Istnieją dwa rodzaje względnych ścieżek. Jedna z postaci "A \ B \ C" i nie implikuje konkretnej bazy. Drugi ma postać ". \ A \ B" lub ".. \ A \ B"; są one związane z bieżącym katalogiem roboczym. – MSalters

+0

@Amit Dhall: Przy okazji, dobrze jest zaakceptować i udzielić odpowiedzi, które ci pomogą. –

Odpowiedz

129

Czy próbowałeś:

string absolute = Path.GetFullPath(relative); 

? Zauważ, że użyje bieżącego katalogu roboczego procesu, a nie katalogu zawierającego plik wykonywalny. Jeśli to nie pomoże, wyjaśnij swoje pytanie.

+2

Czy to nie zależy od tego, od czego uruchamiasz aplikację, a nie od tego, gdzie znajduje się serwer exe? To prawda, nie jest jasne. –

+0

Jak mówisz, pytanie nie jest jasne. GetFullPath rozwiąże działanie z bieżącego katalogu roboczego. Zmienię moją odpowiedź, aby to zaznaczyć. –

+0

Jeśli aplikacja została uruchomiona za pomocą Eksploratora Windows, wydaje się, że katalog bieżący i katalog wykonujący montaż są takie same (przynajmniej dopóki coś nie zostanie zrobione, aby je zmienić). Jest to prawdą, nawet jeśli używasz skrótu do pliku wykonywalnego, w którym skrót znajduje się w zupełnie innym miejscu. – H2ONaCl

17

Jeśli chcesz uzyskać ścieżka względna do .exe następnie użyć

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

Lub, bardziej ogólnie, Path.Combine (myBasePath, relative) ... –

+3

Uważaj tylko na Path.Combine. Jeśli część "względna" zaczyna się od ukośnika, może nie robić tego, co myślisz. –

+1

@silky: cóż, to nie jest względne, czyż nie? –

11

Ten działa na ścieżkach na różnych dyskach, na ścieżkach napędowych względne i dla rzeczywistych ścieżek względnych. Heck, działa nawet wtedy, gdy basePath nie jest w rzeczywistości absolutny; zawsze używa bieżącego katalogu roboczego jako ostatecznego zastępczego.

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

Doskonałe rozwiązanie, ponieważ łączy w sobie ścieżkę absolutną lub rodzinną zgodnie ze ścieżką podstawową. Moim zdaniem, argument relativePath powinien zostać przemianowany na AbsoluteOrRelativePath, ponieważ jest tym, co naprawdę reprezentuje. Dzięki –

+0

Cóż, jeśli jest to już ścieżka bezwzględna, to tylko specjalny przypadek, tak naprawdę ... funkcja nadal ma na celu rozwiązać względne ścieżki, lol. Właśnie nazwałem to tutaj, aby wyjaśnić, który parametr jest:;) – Nyerguds

+0

@JulioNobre, zwłaszcza, że ​​argumenty tutaj są odwrócone w porównaniu do 'Path.Combine'. Jest to łatwe do naprawienia, ale unikam tego, ponieważ często używam go do rozwiązywania względnych ścieżek w katalogu roboczym, a podając wartość zerową jako pierwszy argument wygląda dziwnie. – Nyerguds

Powiązane problemy