안드로이드에서는 앱에서 사용할 디렉토리를 따로 정해주었는데요.
이러한 내부에 파일들에 사용하지 않는 이미지들을 저장했다가 지워야할 때가 있습니다.
앱 내부의 디비에서는 이미지 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처리를 해주면 더욱 좋겠지요.
'Android 개발 > File IO, FilesDir, Storage,' 카테고리의 다른 글
안드로이드 Cache 디렉토리 이용해 xml 화면 공유하기 (2) | 2024.12.10 |
---|---|
Uri 에서 Bitmap 파일 생성하는 방법 # getBitmap ImageDecoder (0) | 2022.11.17 |
Mp3파일 외부 저장소에서 가져와 재생하기 #안드로이드 (0) | 2019.09.07 |
Android 에서 File 저장하기 Part1. Internal Storage 편 (0) | 2017.01.08 |
댓글