코딩항해기

[JAVA] 특정 폴더 내 파일 및 폴더 삭제 (재귀함수/ + File 메서드) 본문

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 등)

'JAVA' 카테고리의 다른 글

[JAVA] UUID Universally Unique Identifier  (0) 2024.10.17
[JAVA] JavaDoc 주석 (API주석)  (0) 2024.10.13
[JAVA] 쿠키 Cookie  (0) 2024.10.12
[JAVA] 파라미터 전달해 main() 실행 (String[] args / eclipse, intellij)  (0) 2024.10.01
[JAVA] Enum  (0) 2024.09.28