본문 바로가기
Android 개발/File IO, FilesDir, Storage,

안드로이드 앱 내부 파일 확장자 체크 후 삭제하기 # delete filesDir

by Developer88 2023. 4. 14.
반응형

안드로이드에서는 앱에서 사용할 디렉토리를 따로 정해주었는데요.

이러한 내부에 파일들에 사용하지 않는 이미지들을 저장했다가 지워야할 때가 있습니다.

앱 내부의 디비에서는 이미지 uri를 가지고 있다가 유저가 해당 데이터를 지웠는데,

이 때, 내부 디렉토리의 파일로는 남아있는 경우입니다.

 

1. FilesDir 와 CacheDir

안드로이드에서는 내부파일에 접근하기 위한 장소로 

FilesDir를 제공해주고 있는데요.

이곳은 완벽하게 다른 앱들은 접근할 수 없는 앱만의 영역으로,
앱이 필요로 하는 데이터나 캐쉬파일들을 저장할 수 있습니다.
API29버전 이상부터 이 영역은 암호화 되어서 저장되게 됩니다.

 

그리고 CacheDir은 이름에서도 알 수 있듯이,

앱에서 사용할 캐쉬파일들을 저장하는 곳 입니다.

당연히 시스템에서 공간이 부족할 경우, 가장 먼저 삭제당하는 곳 입니다.

물론, 캐쉬이므로 삭제된다고 앱이 실행되는데 큰 문제가 생기지는 않겠지요.

 

다만 오늘 글에서는 FilesDir을 중심으로 정리해 보겠습니다.

구현에 있어서는 해당 디렉토리를 filesDir()로 가져오느냐, cacheDir()로 가져오느냐의 차이만 존재하기에,

cacheDir로 바꿔서 사용하는데 어려움이 없을 것 입니다.

 

2. FilesDir 에 있는 파일들 리스트 하기

먼저 해당 디렉토리에 접근해서 파일들을 리스트해야하는데요.

API가 이미 준비가 되어있습니다.

filesDir에 접근하기 위해서는 아래와 같이 getFilesDir API가 있구요.

이는 API1 부터 존재하던 고전 API입니다.

 

 

filesDir 로 해당 디렉토리에 접근한 후에, listFiles()함수를 사용해주면,

해당 디렉토리에 존재하는 파일들을 array에 넣어서 반환해 주는데요.

아래 API문서의 설명에 따르면, 리스팅되는 순서는 랜덤하게 나온다고 하는 군요.

 

실제로 내부디렉토리의 파일들을 가져오는 것은, 아래 한 줄이면 끝납니다.

 

val files = application.filesDir.listFiles()

 

 

3. 지울 확장자 정의하기

내부에 저장했던 파일들을 지운다고 해서, 모든 파일을 다 지우는 것은 좋은 방법이 아닙니다.

되도록이면 최소한 확장자정도는 체크해서 필터링해서 지우는 것이 좋습니다.

왜냐하면 생각지 못한 파일들이 filesDir에 이미 존재하고 있기 때문입니다.

 

val allowedExtensions = listOf("jpg", "jpeg", "png", "bmp", "gif")

 

4. 확장자에 해당하는 파일들 삭제하기

이제 위에서 정의한 확장자에 해당하는 파일들을 삭제해 보도록 하겠습니다.

방법은 간단한데요.

위에서 본대로 filesDir에서 해당 파일들을 array로 가져옵니다.

그리고 for..in 문으로 반복문을 돌려서,

그 파일들 중의 확장자가 위에 정의한 것에 해당한다면 삭제하는 코드입니다.

확장자를 얻어올 때는 아래와 같이 file.extension 으로 얻어올 수 있습니다.

lowercase()는 소문자로 얻어오기 위해서 사용하였습니다.

 

val files = application.filesDir.listFiles()
if(files != null) {
    for(file in files){
        val fileUriString = file.toUri().toString()
        val fileExtention = file.extension.lowercase()
        if(allowedExtensions.contains(fileExtention)){
            file.delete()
        }
    }
}

 

 

파일을 삭제할 때는 delete() 함수를 사용해 주기만 하면 됩니다.

이 역시 File 클래스에 속한 API1 부터 던 고전 API이구요.

해당하는 디렉토리나 파일을 삭제해 주는 역할을 합니다.

해당 파일이 삭제가 되지 않을 때는 IOException을 던진다고 하니,

이러한 부분에 대해서 미리 Exception처리를 해주면 더욱 좋겠지요.

 

 

728x90

댓글