Java File 클래스 renameTo 메소드 관련
- Posted at 2008/02/04 10:01
- Filed under Program/JAVA
예를 들어 windows에서 C 드라이브에 있는 파일을 D 드라이브로 renameTo 메소드를 이용할 경우 rename 되지 않는다. 이유는 windows의 경우 논리적으로 다른 드라이버에서의 rename은 rename이 아니라 copy & delete old 이기 때문이다. 이런 로직을 renameTo 처리해 주면 좋겠지만 그렇지 않다.
또 다른 문제는 서브 디렉토리에 대한 문제이다. 디렉토리를 renameTo할 경우 해당 디렉토리 아래에 파일 또는 서브 디렉토리가 존재하는 경우에도 정상적으로 작동하지 않을 가능성이 크다. 따라서 rename의 경우 별도로 메소드를 만들어서 사용하는 것이 환경적인 문제로 발생하는 오동작을 피할 수 있다.
어제 개발 도중에 이런 문제로 인해 인터넷을 검색해 봤지만 쓸만한 코드를 찾지 못해 직접 만들었다.
private boolean rename(File fromFile, File toFile) throws IOException {
if (fromFile.isDirectory()) {
File[] files = fromFile.listFiles();
if (files == null) {
//디렉토리 내 아무것도 없는 경우
return fromFile.renameTo(toFile);
} else {
//디렉토리내 파일 또는 디렉토리가 존재하는 경우
if(!toFile.mkdirs()) {
return false;
}
for (File eachFile : files) {
File toFileChild = new File(toFile, eachFile.getName());
if (eachFile.isDirectory()) {
if(!rename(eachFile, toFileChild)) {
return false;
}
} else {
if(!eachFile.renameTo(toFileChild)) {
return false;
}
}
}
return fromFile.delete();
}
} else {
//파일인 경우
if(fromFile.getParent() != null) {
if(!toFile.mkdirs()) {
return false;
}
}
return fromFile.renameTo(toFile);
}
}
Posted by 김형준
- Response
- No Trackback , 2 Comments
Trackback URL : http://www.jaso.co.kr/trackback/218
Comments List
-
종종 들러서 좋은정보 잘 보는 1人입니다 ^^
apache commons-io에 있는 FileUtils 에서 원하시는 기능을 찾을 수 있을것 같습니다.
moveXXX 류의 method 들이 renameTo 시도후 실패하면 copy & delete 하는 방식으로 구현되어 있습니다.-
좋은 정보 감사합니다. 해당 기능이 있으면 가져다 사용하는 것이 훨씬 좋죠... 안정성 측면 등을 고려해서요.
-----------------
확인해 보니까 제가 가지고 있는 io 패키지 버전이 옛날 거라서 없었네요.
-






