Leeyebin의 블로그

[JAVA] 파일 이름 변경하기 본문

프로그래밍/JAVA

[JAVA] 파일 이름 변경하기

안되면될때까지 2017. 1. 15. 03:37

저번주 토요일에 대리님께서 일을 주셨다.

기존에 사이트에 있던 '공지사항, FAQ' 등에 있던 첨부파일들을 받아서 새롭게 만든 홈페이지에 올려야하는 일이었다.

근데 문제가 있었다. 기존에 파일들이 확장자와 이름이 없는채로 주셨는데 예를 들면 원래 '2016공지사항.hwp' 파일이었다면 내가 받은 파일들은 확장자가 없는 '1234_board_file(123)' 이런식으로 되어있었다.


현재 파일명 : 1234_board_file(123)

실재 바꿔야할 파일명 : 2016공지사항.hwp


한마디로 첨부파일을 그대로 올릴 수가 없고 엑셀에 있는 목록을 보고 매칭을 해서 파일명을 바꿔야했다.

(엑셀에서 파일명 찾기 -> 진짜 파일명으로 고치기 -> 업로드)

뭐 몇개나 몇십개정도라면 그냥 할 수있을텐데 대량의 단순 작업을 하기는 너무 싫었던게 개발을 한 이유였던 것 같다.

그래서 바로 점심시간에 JAVA로 파일명을 읽어서 바꾸는 것을 찾아보았고, 만들어보게 되었다.


import java.io.File;
import java.util.HashMap;


public class Rename {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//현재파일명, 바꿀파일명 초기화
		HashMap<String, String> map = new HashMap<String, String>();
		
		//건수가 몇백건수준이라면 여기에 넣어도 된다. 예로 2건이 있지만 실제로는 엄청 김
		//map.put("현재파일명", "바꿔야할 파일명");
		map.put("3827_board_file(111)", "tistory.hwp");
		map.put("1234_board_file", "java123.xlsx");

//이름을 바꿀 파일의 디렉토리 세팅 final String folder = "D:/rename"; File file = new File(folder); //해당 디렉토리가 존재하는지 검사 if(!file.isDirectory()){ System.exit(-1); } //파일들의 리스트를 읽어온다. String[] fileList = file.list(); File[] Files = file.listFiles(); for(int i=0; i<fileList.length; i++){ for(int j=0; j<map.size(); j++){ if(map.containsKey(fileList[i])){ //map에 이름이 있는지 (있으면 TRUE, 없으면 FALSE) File newFileName = new File(folder + "/" + map.get(fileList[i])); //있다면 해당하는 value값(바꿔야할 이름)을 빼온다. if(Files[i].renameTo(newFileName)){ System.out.println(i + "번째 파일명 : " + fileList[i] + "===> 변경 성공"); map.remove(fileList[i]); //변경에 성공했다면 이후에는 찾을 필요가 없다. break; } } } } } }

HashMap의 key, value를 '지금이름', '실제 바꿔야하는 이름'으로 바꿔서 작업을 하였다.

필요에 의해서 지금만 사용할 것이기 때문에(계속 사용했어야했다면 엑셀파일 자체를 읽어서 사용했을 듯) 따로 파일을 읽도록 하지는 않았고 UltraEdit으로 만들어서 map에 put하는 소스를 작업하였다.(엑셀의 CONCATENATE함수를 사용해도 편하다.)

이름을 변경할 파일들은 D드라이브의 rename폴더에 넣었다.(소스 20Line 참고)


과정을 요약하자면

지금이름과 바꿔야할 이름쌍들을 HashMap에 세팅 ->  이름 바꿔야할 파일들을 fileList에 세팅 -> fileList사이즈만큼 루프를 돌려서 차례로 HashMap에 key값(지금이름)과 매칭이 되는지 보고 매칭이 되면 이름을 '실제 바꿔야하는 이름'으로 변경한다. -> 이후에 map에 있는 해당 값은 지운다.(갯수가 많다면 시간을 줄이기 위함)이라고 할 수 있다. containsKey를 사용한 이유는 다짜고짜 map.get을 해버려서 매칭에 실패한다면 null이 나오기 때문에 안전빵으로 먼저 거르도록 했다.(비효율적일 수 있다. 포함되어있나 찾아보고 get할 때 또 찾아보기 때문)


이런경우에는 '지금이름', '고쳐야할 이름' 두가지기 때문에 HashMap을 사용했지만 특정값에 의해서 디렉토리가 바뀌거나 폴더가 달라져야한다던지 세팅해야할 데이터들이 더 있다면 따로 VO를 만들듯이 class파일을 만들어서 get,set을 세팅해서 만들면 된다.(이후에 추가)



참고

http://blog.lifeis.gift/335

'프로그래밍 > JAVA' 카테고리의 다른 글

[JAVA] 객체지향  (0) 2017.06.05
[JAVA]SuppressWarnings  (0) 2017.05.22
[JAVA]코드 효율성  (0) 2017.05.22
[JAVA]VO 정렬하기  (0) 2017.01.03
[JAVA]ArrayList, Array  (0) 2016.07.16
Comments