Media Log

[absolute path]에 해당되는 글 1

  1. h Absolute path와 Canonical path의 차이점 (3) 2010.01.13
예전에 Java API에 있는 File 클래스의 메소드들을 보다가 getAbsolutePathgetCanonicalPath를 보고 둘다 사용을 해봤는데 무슨 차이가 있는 것인지 알지를 못했었다. 결과가 항상 같은 절대경로로 나왔던 것이다.
하지만 Canonical path와 Absolute path는 분명한 차이점이 있었는데, 지금부터 설명해보도록 하겠다.

문자열을 통해서 어떤 객체를 표현 한다고 해보자.
5라는 정수는 "5", "000005", "+5", "5.0", "0.5e+01" 등으로 표현할 수 있다.
이것들은 모두 적절한 표현들이지만 이 중 Canonical 표현은 딱 하나다. 여기서는 "5" 이다.

/home/originfile
이런 파일이 있다고 생각해보자. 현재 디렉토리가 /home 이라고 할 때 이 파일의 상대경로는 무수히 많다.

./originfile
../home/originfile
././././originfile

절대경로는 물론 /home/originfile이 될 것이다. 그런데 절대경로가 /home/originfile 1개만 존재할까? 그렇지만도 않다.
/home/../home/originfile
/home/./././originfile
등도 모두 적법한 절대 경로이다.

그 뿐만 아니다.
/home/originfile을 가르키는 /home/symlink 라는 파일을 하나 생성했다고 하자.
/home/symlink라는 절대경로를 통해 이 파일을 참조할 수 있게된다. /home/symlink도 역시 이 파일 객체에 대한 절대 경로라는 뜻이다.
따라서 절대 경로 역시 상대경로와 마찬가지로 무수히 많은 경우의 수를 가질 수 있다.

이들과는 다르게 Canonical Path는 어떤 파일의 경로를 나타내기 위한 유일한 심볼이다.
절대 경로가 어떻든지 상관없이 이 파일에 대한 Canonical path는 항상 /home/originfile 이며 이것은 유일하다. 또한 Canonical path는 항상 절대경로이기도 하다. 물론 역은 성립하지 않는다.

아래에 이해를 돕는 간단한 코드가 있다.
System.setProperty("user.dir", "/home");
File f = new File("/home/originfile");
System.out.println("Abs path : " + f.getAbsolutePath());
System.out.println("Can path : " + f.getCanonicalPath());
f = new File("/home/symlink");
System.out.println("Abs path : " + f.getAbsolutePath());
System.out.println("Can path : " + f.getCanonicalPath());
f = new File("./././originfile");
System.out.println("Abs path : " + f.getAbsolutePath());
System.out.println("Can path : " + f.getCanonicalPath());

Abs path : /home/originfile
Can path : /home/originfile
Abs path : /home/symlink
Can path : /home/originfile
Abs path : /home/./././originfile
Can path : /home/originfile

이제 Canonical Path와 Absolute Path가 어떤 차이가 있는지 이해할 수 있을 것이다.
이것은 Java에서 프로그래밍 할 때만 나오는 것이 아니라 일반적인 개념이기 때문에 프로그래머라면 잘 알아두는 것이 여러모로 좋다.

비스타 부터는 mklink라는 명령이 추가되었는데 심볼릭 링크와 하드링크를 만들 수 있다. 심볼릭 링크를 만들어서 테스트해보면 윈도우즈에서도 아마도 위와 같은 결과가 나올 것이다.

윈도우즈 프로그래밍을 하다보면 MSDN을 읽게 될 때 fully-qualified path라는 용어를 자주 볼 수 있다.
어떤 함수는 인자로서 꼭 fully-qualified path를 전달해야 한다와 같은 내용을 본 적이 있는가?
fully-qualified path는 그냥 절대 경로를 뜻하는 것이 아니라 canonical path와 같은 개념이다.

MSDN에는 fully-qualified path가 2개의 역슬래시로 시작하거나, 드라이브 레터와 역슬래시로 시작해야 한다고 말하고 있다.
예를 들면 다음과 같다.
\\server\share\directory\file.txt
C:\directory\file.txt

그렇지만 다음은 fully-qualified path가 아니다.
C:\directory\..\directory\file.txt
fully-qualified path 또한 하나의 파일 객체과 일대일 대응이 되어야 하며, 그러므로 정규화 되어야 한다.
신고
  1. 다얀 at 2010.01.02 21:03 신고 [edit/del]

    오랜만에 들어왔더니 멋진 블로그로 업글했네?
    돈좀 버나봐?ㅋ

    Reply
  2. Favicon of http://leminity.tistory.com BlogIcon leminity at 2014.01.27 15:02 신고 [edit/del]

    짧게 잘 정리되어 있네요. 잘 보고 갑니다 ^^;

    Reply
  3. thswave at 2015.12.29 08:06 신고 [edit/del]

    좋은 내용 잘 보고 갑니다. 확실하게 이해 되었네요! ^^

    Reply

submit