- 자바 특정 파일 이동 및 이름 변경하기 -
Java File 클래스에서 제공해주고 있는 renameTo() 함수 그리고 몇가지 방법을 통해
파일 이동 및 이름 변경에 대해 알아보자.
사실 파일 이름이라고 하면 경로를 포함하고 있기 때문에 rename과 move를 동일하게 보고있다.
File 클래스 renameTo() 사용
File oldfile = new File("c:/mine_data/mine(1).txt");
File newfile = new File("c:/mine_data/it/mine.txt");
if(oldfile.renameTo(newfile)){
System.out.println("File rename success");
}else{
System.out.println("File rename fail");
}
사용 방법은 간단하다.
변경전 파일(oldfile)을 새로운 경로 및 이름을 가진 파일(newfile)로 renameTo() 해준것이다.
renameTo() 함수는 boolean값을 return 해주므로 성공여부를 확인할 수 있으며,
구글링을 해볼 경우 renameTo()의 경우 실패하는 경우가 생길수 있어 성공여부에 따라
복사하고 삭제해주는 로직을 추가해주고는 한다.
보통 윈도우 환경에서 알수없는 이유로 실패하는 경우가 생길수도 있다하니 참고하자.
Path 클래스와 Files 사용 (Java 7 이상)
try {
Path oldfile = Paths.get("c:/mine_data/mine(1).txt");
Path newfile = Paths.get("c:/mine_data/it/mine.txt");
Files.move(oldfile, newfile);
} catch (IOException e) {
e.printStackTrace();
}
Java7 이상에서 제공하는 Files 와 Path 클래스를 이용하여 renameTo()와 동일하게 파일 이름 변경 또는 이동을 시킨다.
Files.move 또는 Files.copy에서는 추가적으로 옵션을 줄 수 있는데 다음과 같은 기본 옵션이 존재한다.
ATOMIC_MOVE : move 함수 전용 옵션, 원자적 이동 보장
COPY_ATTRIBUTES : 모든 파일 속성(File Attributes)을 복사
REPLACE_EXISTING : 파일이 이미 존재하면 파일을 덮어씀
▷ 옵션 사용법
try {
Path oldfile = Paths.get("c:/mine_data/mine(1).txt");
Path newfile = Paths.get("c:/mine_data/it/mine.txt");
Files.move(oldfile, newfile, StandardCopyOption.ATOMIC_MOVE);
} catch (IOException e) {
e.printStackTrace();
}
Commons IO 사용하기
3번 방법은 사용하기에 앞서 설정이 필요한데, repository를 하나 받아야한다.
아래 링크로 들어가 jar를 받거나, maven 설정들을 해주자. (최신 버전이 부담스러우면 낮춰서 사용해도 된다.)
https://mvnrepository.com/artifact/commons-io/commons-io/2.11.0
설정이 완료되었다면 코드를 살펴보자.
▷ 파일 대상 함수
try {
File oldfile = FileUtils.getFile("c:/mine_data/mine(1).txt");
File newfile = FileUtils.getFile("c:/mine_data/it/mine.txt");
FileUtils.moveFile(oldfile, newfile);
} catch (IOException e) {
e.printStackTrace();
}
▷ 폴더 대상 함수
try {
File file = FileUtils.getFile("c:/mine_data/it");
File fileToMove = FileUtils.getFile("c:/mine_data/mine/its");
FileUtils.moveDirectory(file, fileToMove);
} catch (IOException e) {
e.printStackTrace();
}
FileUtils를 사용할때는 파일과 폴더를 대상으로 하는 함수가 다른데 파일을 대상으로 할때는 moveFile(), 폴더를 대상으로 할때는 moveDirectory()함수를 사용해야한다.
여기서 알아둬야할것은 위 두 함수는 경로 중간에 폴더가 없을경우 폴더를 만들어서 이동시켜주는데
만약 존재하지 않는 폴더는 생성하고 싶지 않다면 moveFileToDirectory(src, des, createDestDir) 함수를 사용하면된다.
try {
File file = FileUtils.getFile("c:/mine_data/it");
File fileToMove = FileUtils.getFile("c:/mine_data/mine/its");
FileUtils.moveFileToDirectory(file, fileToMove, false);
} catch (IOException e) {
e.printStackTrace();
}
createDestDir 옵션은 boolean 값 true, false 를 통해 경로상의 폴더를 생성할지 말지 설정이 가능하다.
물론 false일 경우에는 경로가 없으면 exception이 발생한다.
댓글