마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

file write 파일 삭제 후 file not found

0 추천

파일 다운로드가 잘됩니다만
아래 코드처럼 내 파일에 파일이 있는지 확인하고 있으면 다른파일명으로 만드는 로직인데요

private fun generateUniqueFileName(): String {
    var fileName = "$baseFileName$fileExtension"
    var count = 0

    while (File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), fileName).exists()) {
        count++
        fileName = if (count > 0) {
            "$baseFileName($count)$fileExtension"
        } else {
            "$baseFileName$fileExtension"
        }
    }

    return fileName
}

내 파일에서 파일을 지우고나서 다시 다운로드를 시도하면 filenotfoundexception이 나버립니다 

제가 원하는건 파일명이 test 라하면 두번째 다운로드시 test라는 파일이 있으면 test(1)

세번째 다운로드시 test(2) 이런형태로 가려고 저렇게 한건데 저것도 잘됩니다만

문제는 내파일에서 다 지우고나면 다시 test부터 시작할텐데 그때뭐가 꼬이는건지 file not found exception test (첫번째 파일명) 이 나버립니다 프리퍼런스에 저장할까생각했지만 앱삭제후 다시다운로드시 꼬일거 생각하면 내파일을 스캔하는게 맞다고 생각하는데 어떻게 해야되나요?
 

수원통학러 (3,570 포인트) 님이 3월 26일 질문
전체 코드입니다
        override fun onDownloadStart(
            url: String,
            userAgent: String,
            contentDisposition: String,
            mimeType: String,
            contentLength: Long
        ) {

            try {
                val fileName = generateUniqueFileName()

                notificationBuilder = context?.let {
                    NotificationCompat.Builder(it, CHANNEL_ID)
                        .setContentTitle("파일 다운로드중입니다.")
                        .setSmallIcon(android.R.drawable.stat_sys_download)
                        .setAutoCancel(true)
                        .setContentText("$fileName")
                }

                callbackTest?.callback("다운로드중")

                notificationManager?.notify(notificationId, notificationBuilder?.build())

                val base64value = url.substring(url.indexOf("base64,") + 7)
                val excelAsBytes: ByteArray = Base64.decode(base64value, 0)

                val dwldsPath = File(
                    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
                    fileName
                )

                val os = FileOutputStream(dwldsPath, false)
                os.write(excelAsBytes)
                updateNotificationProgress(dwldsPath.absolutePath,fileName)
                os.flush()
                os.close()

            }catch (e : Exception) {
                Log.e("ljy", "${e.message}")
            }
        }


        private fun generateUniqueFileName(): String {
            var fileName = "$baseFileName$fileExtension"
            var count = 0

            while (File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), fileName).exists()) {
                count++
                fileName = if (count > 0) {
                    "$baseFileName($count)$fileExtension"
                } else {
                    "$baseFileName$fileExtension"
                }
            }

            return fileName
        }
        private fun updateNotificationProgress(path: String, fileName: String) {
            val viewIntent = Intent(Intent.ACTION_VIEW)
            val excelFile = File(path)
            val excelUri: Uri? = context?.let { FileProvider.getUriForFile(it, "${it.applicationContext?.packageName}.provider", excelFile) }
            viewIntent.setDataAndType(excelUri, "application/vnd.ms-excel")
            viewIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)

            val pendingIntent = PendingIntent.getActivity(context, 0, viewIntent, PendingIntent.FLAG_IMMUTABLE)


            notificationBuilder = context?.let {
                NotificationCompat.Builder(it, CHANNEL_ID)
                    .setContentTitle("파일 다운로드 완료되었습니다.")
                    .setSmallIcon(android.R.drawable.stat_sys_download_done)
                    .setAutoCancel(true)

                    .setContentIntent(pendingIntent)
                    .setContentText("$fileName")
            }

            notificationManager?.notify(notificationId, notificationBuilder?.build())
        }
    }

1개의 답변

0 추천
실제 실행해 보지 않고는 추측하기 쉽지 않겠네요. 한가지 추측이 되는 부분은 디렉토리 관련 부분인데.

파일을 생성할 때, 해당 파일이 저장될 디렉토리가 존재하는지 체크하시고 없으면 생성을 먼저 해줘야 합니다. 혹시 디바이스에서 파일 삭제하실 때 디렉토리까지 삭제하셨을 수도 있으니 이 부분 체크해 보세요.
spark (227,530 포인트) 님이 3월 27일 답변
...