[c#] Windows 응용 프로그램에서 상대 경로를 절대 경로로 변환하는 방법은 무엇입니까?

Windows 응용 프로그램에서 상대 경로를 절대 경로로 어떻게 변환합니까?

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

내 말은, 그것을 처리 할 수있는 .NET 내장 함수가 있다면 …



답변

시도해 보셨습니까?

string absolute = Path.GetFullPath(relative);

? 실행 파일이 포함 된 디렉토리가 아니라 프로세스의 현재 작업 디렉토리를 사용합니다. 그래도 도움이되지 않으면 질문을 명확히하십시오.


답변

.exe에 상대적인 경로를 얻으려면 다음을 사용하십시오.

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


답변

이것은 다른 드라이브의 경로, 드라이브 상대 경로 및 실제 상대 경로에 대해 작동합니다. basePath실제로 절대적이지 않아도 작동합니다 . 항상 현재 작업 디렉토리를 최종 폴백으로 사용합니다.

public static String GetAbsolutePath(String path)
{
    return GetAbsolutePath(null, path);
}

public static String GetAbsolutePath(String basePath, String path)
{
    if (path == null)
        return null;
    if (basePath == null)
        basePath = Path.GetFullPath("."); // quick way of getting current working directory
    else
        basePath = GetAbsolutePath(null, basePath); // to be REALLY sure ;)
    String finalPath;
    // 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(path) || "\\".Equals(Path.GetPathRoot(path)))
    {
        if (path.StartsWith(Path.DirectorySeparatorChar.ToString()))
            finalPath = Path.Combine(Path.GetPathRoot(basePath), path.TrimStart(Path.DirectorySeparatorChar));
        else
            finalPath = Path.Combine(basePath, path);
    }
    else
        finalPath = path;
    // resolves any internal "..\" to get the true full path.
    return Path.GetFullPath(finalPath);
}


답변

조금 오래된 주제이지만 누군가에게 유용 할 수 있습니다. 비슷한 문제를 해결했지만 제 경우에는 경로가 텍스트 시작 부분에 있지 않았습니다.

그래서 여기 내 해결책이 있습니다.

public static class StringExtension
{
    private const string parentSymbol = "..\\";
    private const string absoluteSymbol = ".\\";
    public static String AbsolutePath(this string relativePath)
    {
        string replacePath = AppDomain.CurrentDomain.BaseDirectory;
        int parentStart = relativePath.IndexOf(parentSymbol);
        int absoluteStart = relativePath.IndexOf(absoluteSymbol);
        if (parentStart >= 0)
        {
            int parentLength = 0;
            while (relativePath.Substring(parentStart + parentLength).Contains(parentSymbol))
            {
                replacePath = new DirectoryInfo(replacePath).Parent.FullName;
                parentLength = parentLength + parentSymbol.Length;
            };
            relativePath = relativePath.Replace(relativePath.Substring(parentStart, parentLength), string.Format("{0}\\", replacePath));
        }
        else if (absoluteStart >= 0)
        {
            relativePath = relativePath.Replace(".\\", replacePath);
        }
        return relativePath;
    }
}

예:

Data Source=.\Data\Data.sdf;Persist Security Info=False;
Data Source=..\..\bin\Debug\Data\Data.sdf;Persist Security Info=False;


답변