[Java] 안전하게 파일 삭제하기

2023. 12. 22. 10:10☕️ Java

 

목차

1. File.delete()

2. Files.delete()

3. 해당 파일이 존재하는 디렉토리(폴더)까지 모두 삭제

 


 

자바에서 메모리에 존재하는 파일을 삭제하는 방법을 알아보자.

안전하게 파일을 삭제하고 해당 파일이 존재하는 폴더 내부를 모두 삭제하는 방법까지 알아보겠다.

 

1. File.delete()

가장 간단하게 File 클래스에 존재하는 delete method 를 직접 호출하는 방법이 있다.

File 인스턴스에서 직접 delete() 를 호출하는 방법이다.

public class SimpleTest {
    @Test
    public void FILE_SIMPLE_DELETE() {
        File file = new File("./test");
        file.delete();
    }
}

 

해당 delete() 메서드는 boolean 타입을 리턴한다.

즉 파일이 정상적으로 삭제되면 true, 그렇지 않을 경우엔 false 를 리턴한다.

존재하지 않는 경로의 파일을 삭제할 경우 아래처럼 false 가 리턴되는 것을 확인할 수 있다.

 

 

File.delete() 메서드는 파일을 삭제하는 간단한 방법이지만

실수로 파일의 경로를 잘못 입력하는 경우 해당 파일이 삭제되지 않고 그저 false 값만 리턴될 수 있다.

그럴 경우 아래처럼 분기문을 추가하여 예외를 던질 수도 있다.

@Test
public void DELETE_NOT_EXISTING_FILE() throws FileNotFoundException {
    File file = new File("./test");
    boolean delete = file.delete();
    if (!delete) {
        throw new FileNotFoundException();
    }
}

 

 

2. Files.delete()

File 클래스의 delete()는 존재하지 않는 파일을 삭제하더라도 그저 false를 리턴하는데 그친다.

java.nio.file 패키지의 Files.delete() 는 위 같은 경우 예외를 던져 명시적으로 파일 삭제가 정상적으로 이뤄지지 않았음을 알린다.

 

해당 메서드는 파일 인스턴스에서 직접 호출하는 대신

Path 인터페이스에 정의된 정적 메서드로 파일의 경로(path) 값을 가져와 파일을 삭제한다.

@Test
public void FILE_SAFE_DELETE() throws IOException {
    File file = new File("src/test/java/com/tripbtoz/test");
    Path path = Path.of(file.getPath());
    Files.delete(path);
    assertFalse(file.exists());
}

 

 

존재하지 않는 파일을 삭제할 경우 Files.delete() 메서드는 예외를 던진다.

 

 

안정적인 코딩 스타일을 추구한다면 위 방법으로 파일을 삭제하는 것을 권장한다.

 

 

3. 해당 파일이 존재하는 디렉토리(폴더)까지 모두 삭제

특정 파일이 존재하는 디렉토리(혹은 패키지) 자체를 삭제하는 방법이다.

@Test
public void DELETE_WHOLE_DIRECTORY() throws IOException {
    File file = new File("src/test/java/com/tripbtoz/folder/test");
    File parentFile = file.getParentFile(); // 상위 디렉토리를 가져온다.
    FileUtils.cleanDirectory(parentFile); // 디렉토리에 존재하는 모든 파일을 삭제하고
    Files.delete(Path.of(parentFile.getPath())); // 해당 디렉토리까지 삭제한다.
}

 

우선 해당 파일의 상위 파일, 즉 상위 디렉토리를 가져온다. 그 후 FileUtils.cleanDirectory() 메서드를 사용해 상위 파일을 인자로 넣으면 내부에서 해당 폴더에 존재하는 전체 파일 목록을 순회하며 삭제한다.

 

 

 

 

이렇게 하여 folder 패키지 내부의 모든 파일과 해당 패키지까지 삭제할 수 있었다.

EC2 인스턴스 내부에서 임시로 PDF나 이미지 파일 등을 생성 후 삭제할 때 유용하게 적용할 수 있는 방법이라 생각한다.