2009-09-09 7 views
64

Windows 응용 프로그램에서 상대 경로를 절대 경로로 변환하려면 어떻게해야합니까?Windows 응용 프로그램에서 상대 경로를 절대 경로로 변환하는 방법은 무엇입니까?

ASP.NET에서 server.MapPath()를 사용할 수 있습니다. 그러나 Windows 응용 프로그램에서 우리는 무엇을 할 수 있습니까? 이 경우

는 I는 .NET 것을 처리 할 수있는 내장 함수 ...

+1

현재 디렉터리에 대한 상대 경로, 즉 작업 디렉터리 또는 .exe 위치의 상대 경로를 의미합니까? –

+1

상대 경로에는 두 가지 종류가 있습니다. 하나는 "A \ B \ C"형식이고 특정 기준을 의미하지는 않습니다. 다른 하나는 ". \ A \ B"또는 ".. \ A \ B"형식입니다. 그것들은 현재 작업 디렉토리와 관련이 있습니다. – MSalters

+0

@Amit Dhall : 그건 그렇고, 당신을 도울 대답을 받아들이고 upvote하는 것이 좋습니다. –

답변

129

당신이 봤어 의미 :

string absolute = Path.GetFullPath(relative); 

? 실행 파일이 들어있는 디렉토리가 아니라 프로세스의 현재 작업 디렉토리를 사용한다는 점에 유의하십시오. 도움이되지 않는 경우 질문을 명확히하십시오. 당신이 얻고 싶은 경우에

+2

그게 어디에있는 exe가 위치하고있는에 따라 응용 프로그램을 시작할 위치에 의존하지 않을까요? 그 질문에 대해서는 분명히 밝혀지지 않았다. –

+0

당신이 말했듯이, 질문은 명확하지 않습니다. GetFullPath는 현재 작업 디렉터리에서 확인됩니다. 나는 이것을 나타 내기 위해 나의 반응을 편집 할 것이다. –

+0

응용 프로그램이 Windows 탐색기를 통해 시작된 경우 현재 디렉토리와 실행중인 어셈블리 디렉토리가 같아집니다 (최소한 다른 작업을 수행하기 전까지). 바로 가기가 완전히 다른 위치에있는 실행 파일로 바로 가기를 사용하더라도 사실입니다. – H2ONaCl

17

에 .exe에 상대적인 경로는

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

또는 더 일반적으로 Path.Combine (myBasePath, relative) ... –

+3

Path.Combine에주의하십시오. '친척'부분이 슬래시로 시작하면, 당신이 생각하는대로 할 수 없습니다. –

+1

@ 실키 : 음, 그럼 상대가 아니지? –

11

이 하나가 드라이브 상대 경로에 대해 서로 다른 드라이브에 경로에 대한 실제 상대 경로 작동 사용합니다. 지옥, 그것은 심지어 basePath가 실제로 절대가 아닌 경우에 작동합니다. 현재의 작업 디렉토리를 최종 폴백으로 항상 사용합니다.

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

기본 경로에 따라 절대 경로 또는 친척 경로를 결합하므로 훌륭한 솔루션입니다. 내 의견으로는, relativePath 인수는 AbsoluteOrRelativePath로 이름을 바꿔야한다. 감사합니다 –

+0

음, 이미 절대 경로라면, 그것은 단지 특별한 경우입니다. 실제로 ... 함수는 여전히 상대 경로를 해결하기위한 것입니다, 롤. 난 그냥 여기에 어떤 매개 변수가 무엇인지 명확하게하기 위해 이름을 붙였다.) – Nyerguds

+0

@JulioNobre는 특히 여기의 인수가'Path.Combine'과 비교하여 역전되어 있기 때문에 이름을 붙였다. 이것은 쉽게 해결할 수 있지만 작업 디렉토리의 상대 경로를 확인하고 첫 번째 arg가 이상하게 보일 때 null을 사용하는 경우가 많으므로 사용하지 마십시오. – Nyerguds

관련 문제