2012년 1월 27일 금요일

JDK 5,7에서 파일속성을 hide로 바꿔보자.


일단 JDK5와 JDK7버전을 두개를 놓고 구현해 보겠다.
JDK7에서 NIO2가 새롭게 등장하면서 파일에 대한 접근 방법이 많이 추가되었다.

일단 JDK5에서는 파일을 숨기는 API 를 별도로 제공하지 않는다.
그러나 약간의 꼼수를 사용한다면 구현은 가능하다.
그리고 OS별로 환경변수 설정방법이 틀리듯이 디렉토리 의 구조적인 모습 또한 틀리다.
(Win,Unix,Linux별로 약간의 차이가 있다.)

Windows의 경우 Runtime.getRuntime.exec("command")를 이용하여 손쉽게 파일을 숨길수가 있다.
예를 들어 이렇게 말이다. 
다른 OS의 경우에도 이런식으로 명령어를 통한 파일에 대한 간섭을 하는것이 일반적이다.

Runtime.getRuntime().exec("attrib +H HiddenFileExample.java");

좀더 구체적으로 살펴 보자면 이런식이다.

void setHiddenProperty(File file) throws InterruptedException, IOException {
    Process p = Runtime.getRuntime().exec("attrib +H " + file.getPath());
    p.waitFor();
}

여기에서 p.waitFor()는 필수적인것은 아니다. 하지만 이 해당 명령어가 실행이 완료될동안 안정성을 보장받기 위해서 는 이 부분을 명시해야한다.
(명령어를 실행하고 나서는 os쪽으로 통제가 떠나기 때문에 안정성이 보장되지 않는다.)


 JDK7부터는 파일을 통제하기 쉽게 새로운 API들이 추가 되었다.

Path에 접근하고 위치를 파악할수 있는 일종의 선택자 같은 기능을 가진 API를 제공하게 되었다.

위의 내용을 JDK7의 새로운 API를 활용해서 바꿔보자.

Path path = FileSystems.getDefault().getPath("directory", "hidden.txt");
Boolean hidden = path.getAttribute("dos:hidden", LinkOption.NOFOLLOW_LINKS);
if (hidden != null && !hidden) {
    path.setAttribute("dos:hidden", Boolean.TRUE, LinkOption.NOFOLLOW_LINKS);
}

Runtime.exec()를 통한 기존의 방법이나 새로운 java.nio.file 패키지를 활용하거나 둘다 파일에 대한 컨트롤이 가능하다.

댓글 없음:

댓글 쓰기