티스토리 뷰

반응형

플러터 작업중 당황스러운 일이 있었다.

 

잘 작동되던 코드가 어느순간 오작동을 하고 있었다.

dio.download()를 통해 파일을 다운로드 시 아래와 같은 에러가 뜬것

 

FileSystemException: Cannot create file, path = '/storage/emulated/0/Download/~' (OS Error: File exists, errno = 17)

 

인지하지 못한 코드상의 에러는 종종 있었으나 차근차근 되짚어 나가다 보면 문제가 되는 코드를 발견할 수 있는데 이번에는 아무리 코드를 확인하고 개발 문서를 뒤져봐도 코드상에는 문제가 없었다. 또한 모든 디바이스에서 나타나는 현상이 아니라 Android sdk 30 버전 디바이스에서만 나타나고 있었다.

 

일전에 안드로이드의 소프트웨어 버전이 11로 올라갈때 storage 권한 관련해서 골머리를 썩었기 때문에 이쪽 관련해서는 나의 코드에 대해 정확히 알고 있었기에 다른 가능성을 고려했다.

 

우선 권한관련된 문서를 체크해 내가 알고있는 지식에서 바뀐것이 있는지를 체크했으나 역시나 문제없고 바뀐것도 없었다.

 

다음으로는 계속해서 다운로드 경로를 바꿔가며 테스트하고 폴더 자체를 지우고 다시 다운로드 받으며 어떨때 에러가 나는지를 체크했다. 신기한건 다운로드가 무조건 안되는것이 아니고 간헐적으로 안됐었다.

 

이러한 나의 테스트는 오히려 독이되었다. 많은 테스트 끝에 원인을 파악을 했고 그 원인은 아래와 같다.

 

Andorid sdk 30 버전에서 공용폴더(Download, Document)에 파일을 다운 받고 기본앱인 파일 어플을 통해 해당 경로에서 파일을 직접 삭제후 다시 어플에서 같은 path 같은 이름을 사용해 파일을 다운로드 받으면 이미 지운 파일임에도 이미 존재하는 파일로 인식을 한다는것,, 어플을 삭제해도 공용폴더는 Scoped Storage로서 사라지지 않기 때문에 어플을 삭제했다가 설치해서 시도해도 마찬가지인 것이다.

 

신기한것은 안드로이드에서 모든 파일권한을 가지게하는 MANAGE_STORAGE 라는것이 있는데 이 권한을 주면 같은 상황에서 에러가 일어나지 않는다,, 하지만 이 권한은 특별한 허가 절차를 거쳐야 넣을 수 있기때문에 테스트로만 사용했다.

 

결론적으로 해결방법은 몇가지를 제시할 수 있고 아래와 같다.

 

1. Download, Document 폴더를 피해 어플의 내부 저장소를 사용한다.

 - 이 방법은 가장 간단하지만 사용자가 파일을 폴더앱에서 직접 확인하거나 옮기고 삭제하는등 작업을 수행하지 못한다.

2. MANAGE_STORAGE 권한을 준다.

 - 가장 강력하지만 어플의 컨셉이 다른 앱의 저장소에도 접근해야하는 이유가 없다면 허가가 떨어지기 어려울것이다.

3. File name에 Uuid를 붙여 저장하기 

 - 가장 현실적인 방법으로 Download나 Document 폴더에 저장을 하되 중복될 수 없는 이름으로 저장을 시키면 된다.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함