본문 바로가기

Language/Java / JSP

[JAVA] File renameTo() 에러에 관하여

반응형

개발을 하다보면 파일 객체를 다룰일이 종종 있다.
특정 위치로 파일을 옮긴다던지, 또는 웹서비스에서 파일 업로드룰 구현할때 특정 위치로 옮긴다던지 할때가 그렇다.



이때 파일을 이동할때 자주 사용하는 메소드가 renameTo() 이다.


나는 renameTo 메소드를 이용하여 코드를 작성할때 보통 아래와 같이 작성을 많이 한다.

	byte[] buf = new byte[1024];
	FileInputStream fin = null;
	FileOutputStream fout = null;


	File oldFile = new File(savePath + uploadFile);
	File newFile = new File(savePath + newFileName);

	if(!oldFile.renameTo(newFile)){
		buf = new byte[1024];
		fin = new FileInputStream(oldFile);
		fout = new FileOutputStream(newFile);

		int read = 0;
		while((read=fin.read(buf,0,buf.length))!=-1){
			fout.write(buf, 0, read);
		}
		
		fin.close();
		fout.close();
		oldFile.delete();
	}





어느날 후배녀석이 나에게 물었다.
renameTo를 사용했는데 파일을 복사하고 기존파일을 삭제하는 코드는 왜 넣었냐고...


이유는 간단하다. renameTo() 를 믿지 못하기 때문이다.
renameTo는 오류 발생시 특별한 예외를 발생시키지 않고, 단순하게 성공/실패 결과만을 알려준다.
그리고 윈도우 환경에서 renameTo를 사용할경우 종종 정상적인 파일 객체인데도 불구하고 실패를 반환한다.


윈도우에서 실패가 나오는것은 아래와 같은 현상이 발생해서라고 한다.(구글링 검색 ~)

1. A file handle is inherited by a subprocess of your process
2. An anti-virus program is scanning the file for viruses, and so has it open
3. An indexer (such as Google Desktop or the Windows indexing service) has the file open



그렇기 때문에 나는 renameTo가 실패했을때 강제로 파일을 복사하고 기존 파일을 삭제하는 로직을 추가한 것이다.



끝으로. 해외 어느 커뮤니티에서 renameTo가 얼마나 많이 실패하는지에 대한 내용이 있어서 캡쳐해 봤다.