From 8205498f16edc4b49d255a784691377f75122abf Mon Sep 17 00:00:00 2001 From: aoi Date: Tue, 26 May 2026 00:49:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B0=81=E9=9D=A2=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E5=9C=A8cache=E8=B7=AF=E5=BE=84=E9=87=8C=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E6=84=8F=E5=A4=96=E8=A2=AB=E6=B8=85=E7=90=86=E7=9A=84?= =?UTF-8?q?bug=20(#1169)=20@woruteyqi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复封面保存在cache路径里导致意外被清理的bug --- .../book/info/edit/BookInfoEditViewModel.kt | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditViewModel.kt b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditViewModel.kt index 446688674..3d47cdb77 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditViewModel.kt @@ -18,6 +18,7 @@ import io.legado.app.help.book.removeType import io.legado.app.model.ReadBook import io.legado.app.utils.FileUtils import io.legado.app.utils.MD5Utils +import io.legado.app.utils.externalFiles import io.legado.app.utils.inputStream import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -157,20 +158,23 @@ class BookInfoEditViewModel(application: Application) : BaseViewModel(applicatio fun coverChangeTo(context: Context, uri: Uri) { execute { runCatching { - context.externalCacheDir?.let { externalCacheDir -> - val file = File(externalCacheDir, "covers") - val suffix = context.contentResolver.getType(uri)?.substringAfterLast("/") ?: "jpg" - val fileName = uri.inputStream(context).getOrThrow().use { MD5Utils.md5Encode(it) } + ".$suffix" - val coverFile = FileUtils.createFileIfNotExist(file, fileName) - context.contentResolver.openInputStream(uri)?.use { inputStream -> - FileOutputStream(coverFile).use { outputStream -> - inputStream.copyTo(outputStream) - } + val suffix = context.contentResolver.getType(uri)?.substringAfterLast("/") ?: "jpg" + val coversDir = FileUtils.createFolderIfNotExist(context.externalFiles, "covers") + val tempFile = File(coversDir, "${System.currentTimeMillis()}.tmp") + uri.inputStream(context).getOrThrow().use { inputStream -> + FileOutputStream(tempFile).use { outputStream -> + inputStream.copyTo(outputStream) } - _uiState.value = _uiState.value.copy(coverUrl = coverFile.absolutePath) - } ?: run { - AppLog.put("External cache directory is null", Throwable("Null directory"), true) } + val md5 = tempFile.inputStream().use { MD5Utils.md5Encode(it) } + val coverFile = File(coversDir, "$md5.$suffix") + if (coverFile.exists()) { + tempFile.delete() + } else if (!tempFile.renameTo(coverFile)) { + tempFile.copyTo(coverFile, overwrite = true) + tempFile.delete() + } + _uiState.value = _uiState.value.copy(coverUrl = coverFile.absolutePath) }.onFailure { AppLog.put("书籍封面保存失败\n$it", it, true) }