C# – 상대경로 생성

Path 클래스를 사용하면 상대경로를 절대경로로 바꾸는건 쉬운데..
꺼꾸로 절대경로를 상대경로로 바꾸는 메소드가 없어서 stackoverflow 참고하여 약간 수정하였습니다.

참고 : http://stackoverflow.com/questions/275689/how-to-get-relative-path-from-absolute-path

첫번째 파라메터는 상대경로를 구하기 위해 비교할 경로입니다.
보통 아래와 같은 값을 사용하여 넣어주시면 됩니다.

System.Environment.CurrentDirectory
Application.StartupPath

 

두번째 파라메터는 절대경로입니다.

public string EvaluateRelativePath(String mainDirPath, String absoluteFilePath)
{
    // 입력값 검증
    if (String.IsNullOrEmpty(mainDirPath)) throw new ArgumentNullException("mainDirPath 입력값이 null 또는 공백입니다.");
    if (String.IsNullOrEmpty(absoluteFilePath)) throw new ArgumentNullException("absoluteFilePath 입력값이 null 또는 공백입니다.");
    if (Path.GetPathRoot(mainDirPath) != Path.GetPathRoot(absoluteFilePath)) throw new ArgumentException("입력값의 루트가 다르므로 처리할 수 없습니다.");
    if (Path.IsPathRooted(mainDirPath) == false) throw new ArgumentException("mainDirPath 이 절대경로가 아닙니다.");
    if (Path.IsPathRooted(absoluteFilePath) == false) throw new ArgumentException("absoluteFilePath 이 절대경로가 아닙니다.");

    // 입력값 보정, C:test 일때 test가 파일인지 디렉토리인지 애매하다
    mainDirPath = mainDirPath.Trim();
    absoluteFilePath = absoluteFilePath.Trim();
    if (Directory.Exists(mainDirPath + Path.DirectorySeparatorChar)) mainDirPath = mainDirPath + Path.DirectorySeparatorChar;
    if (Directory.Exists(absoluteFilePath + Path.DirectorySeparatorChar)) absoluteFilePath = absoluteFilePath + Path.DirectorySeparatorChar;

    // 상대 경로 추출
    Uri mainDirUri = new Uri(mainDirPath);
    Uri absoluteFileUri = new Uri(absoluteFilePath);
    Uri relativeUri = mainDirUri.MakeRelativeUri(absoluteFileUri);
    String relativePath = Uri.UnescapeDataString(relativeUri.ToString());

    // 리턴
    return relativePath.Replace('/', Path.DirectorySeparatorChar);
}

 

사용자 삽입 이미지

댓글 남기기