Java File 클래스 renameTo 메소드 관련

Java의 File 클래스에 있는 기능 중 renameTo 메소드는 잘못 사용할 가능성이 많은 메소드이다. Windows와 Linux에서 다르게 동작할 수 있으며 파일 시스템의 디스크 구성에 따라 다르게 작동할 수 있기 때문이다.
예를 들어 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);

    }

  }

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


Trackback URL : http://www.jaso.co.kr/trackback/218

Comments List

  1. pistos 2008/02/04 19:15 # M/D Reply Permalink

    종종 들러서 좋은정보 잘 보는 1人입니다 ^^
    apache commons-io에 있는 FileUtils 에서 원하시는 기능을 찾을 수 있을것 같습니다.
    moveXXX 류의 method 들이 renameTo 시도후 실패하면 copy & delete 하는 방식으로 구현되어 있습니다.

    1. 김형준 2008/02/04 19:44 # M/D Permalink

      좋은 정보 감사합니다. 해당 기능이 있으면 가져다 사용하는 것이 훨씬 좋죠... 안정성 측면 등을 고려해서요.
      -----------------
      확인해 보니까 제가 가지고 있는 io 패키지 버전이 옛날 거라서 없었네요.

Leave a comment
« Previous : 1 : ... 206 : 207 : 208 : 209 : 210 : 211 : 212 : 213 : 214 : ... 388 : Next »