JAVA
[JAVA] 특정 폴더 내 파일 및 폴더 삭제 (재귀함수/ + File 메서드)
miniBcake
2024. 10. 12. 21:41
File 관련 메서드
메서드 | 내용 | 반환 |
boolean exists() | 파일이나 디렉토리가 존재하는지 확인 | boolean |
boolean createNewFile() | 새로운 파일을 생성 (파일이 이미 존재하면 false 반환) | boolean |
boolean delete() | 파일이나 빈 디렉토리를 삭제 | boolean |
String getName() | 파일 이름을 반환 | 파일 이름 (String) |
String getPath() | 파일 경로를 반환 | 파일 경로 (String) |
boolean isDirectory() | 해당 경로가 디렉토리인지 확인 | boolean |
boolean isFile() | 해당 경로가 파일인지 확인 | boolean |
long length() | 파일의 크기 (바이트 단위) | 파일 크기 (long) |
boolean mkdir() | 새로운 디렉토리 생성 | boolean |
boolean mkdirs() | 경로 상의 모든 필요한 디렉토리 생성 | boolean |
File[] listFiles() | 디렉토리 내의 파일 목록을 반환 | 파일 목록 (File[]) |
boolean renameTo(File dest) | 파일이나 디렉토리의 이름 변경 | boolean |
long lastModified() | 파일이 마지막으로 수정된 시간을 반환 | 타임스탬프 (long) |
boolean canRead() | 파일이 읽기 가능한지 확인 | boolean |
boolean canWrite() | 파일이 쓰기 가능한지 확인 | boolean |
boolean canExecute() | 파일이 실행 가능한지 확인 | boolean |
String[] list() | 디렉토리 내 파일 및 디렉토리 이름 배열 반환 | 이름 배열 (String[]) |
현재 로직에서 서버에 있는 이미지 파일을 지우기 위해 이미지들을 저장한 폴더에서 불러온 DB데이터와 일치하는 파일을 찾아 지우고 있는 부분을 정리할 수 있을 것 같아 하위에 폴더를 만들어 각각의 폴더에 저장 후 해당 폴더를 삭제하는 방법으로 개선하고자 했다.
여기서 문제가 하나 발생했는데, JAVA는 폴더 안에 파일이나 폴더가 있다면 해당 폴더를 삭제할 수 없다는 문제이다. 물론 현재 로직에서는 폴더 아래에 폴더가 있는 구조는 없기 때문에 해당 폴더 안의 모든 파일을 불러와 삭제 후 폴더를 삭제하는 방식으로 처리할 수도 있지만, 후에 폴더 아래에 폴더가 있는 폴더를 지우는 일이 생기게 된다면 다시 메서드를 구성해야하므로 재사용성이 떨어진다.
이러한 문제를 해결하기 위해 몇 가지 파일 처리에 관한 글을 읽었는데, 재귀함수를 이용한 방식을 보게 되어 해당 블로그 글을 참고해 코드를 구성하기로 했다.
//해당 폴더 하위의 폴더와 파일 삭제
private boolean deleteFileAndDirctory (File folder){
log.info("log: deleteFile - start");
//서버에 해당 경로의 폴더가 있다면
if(folder.exists()) {
File[] files = folder.listFiles(); //해당 폴더의 파일리스트 데이터
if(files != null) { //빈 폴더가 아니라면
for(File file : files) {
log.info("log: deleteFile - board image file delete file : [{}]", file);
if(file.isDirectory()){ //만약 파일이 아니라 폴더라면
log.info("log: deleteFile - {} is directory", file);
//재귀함수
deleteFileAndDirctory(file);
}
if(!file.delete()){ //해당 파일 삭제
//파일 삭제 실패 시
//개발자에게 안내
log.error("log: deleteFile - board image file delete fail!!!! file : [{}]", file.getPath());
}
}
if(!folder.delete()){
//폴더 삭제 실패 시 개발자에게 안내
log.error("log: deleteFile - board image folder delete fail!!!! folder : [{}]", folder.getPath());
return false;
}
}
}
else{
//해당 경로에 폴더가 존재하지 않음을 안내
log.error("log: deleteFile - no image folder error imagePath: [{}]", folder.getPath());
return false;
}
log.info("log: deleteFile - end / true");
return true;
}
이러한 구조로 구성하면 폴더 하위에 몇 개의 폴더가 있더라도 재귀함수를 통해 해당 메서드가 반복 실행되며 파일을 삭제하게 된다. 실패 시 처리하는 부분은 개선할 여지가 있어 보인다.
(현재 로그는 logback을 사용 중이다. log.info, log.error 등)