android Kotlin()不适用于cacheDir

3mpgtkmj  于 2022-11-20  发布在  Android
关注(0)|答案(3)|浏览(228)

我尝试删除应用程序的缓存子文件夹(甚至该高速缓存文件夹本身),但没有任何React。

cacheFolder = File(this.cacheDir, "/download")
deleteFolder(cacheFolder)

private fun deleteFolder(fileOrDirectory : File){
    fileOrDirectory.deleteRecursively()
}

这句俏皮话也不管用

this.cacheDir.deleteRecursively()

有什么想法吗?

w8biq8rn

w8biq8rn1#

最好使用服务删除cacheFiles
我就是这样做的

class DeleteCache(context: Context, workerParams: WorkerParameters) :
    Worker(context, workerParams) {
    override fun doWork(): Result {
        return try {
            applicationContext.cacheDir?.let {
                if (it.exists()) {
                    val entries = it.listFiles()
                    if (entries != null) {
                        for (entry in entries) {
                            entry.delete()
                        }
                    }
                }
            }
            Result.success()
        } catch (e: Exception) {
            Result.failure()
        }
    }
}
nukf8bse

nukf8bse2#

不幸的是,File.deleteRecursively()函数并没有告诉你删除失败的原因,它只是返回true或false来显示删除是否成功,如果返回false,则说明目录树可能被部分删除了。
与其使用旧的java.io.File类(该函数是其Kotlin扩展),不如使用“较新的”java.nio实用程序类,因为这些类将抛出一个IOException来描述删除失败的原因。不幸的是,Kotlin目前没有提供使用java.niodeleteRecursively()函数,它只提供了一个Path类上的非递归deleteExisting()函数。您可以编写自己Path.deleteRecursively()扩展函数与Path.deleteExisting()一起使用:

import java.io.IOException
import java.nio.file.FileVisitResult
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.SimpleFileVisitor
import java.nio.file.attribute.BasicFileAttributes
import kotlin.io.path.deleteExisting

fun Path.deleteRecursively() {
    Files.walkFileTree(
        this,
        object : SimpleFileVisitor<Path>() {
            override fun visitFile(file: Path, attrs: BasicFileAttributes?): FileVisitResult {
                file.deleteExisting()
                return FileVisitResult.CONTINUE
            }

            override fun postVisitDirectory(dir: Path, exc: IOException?): FileVisitResult {
                if (exc != null)
                    throw exc
                dir.deleteExisting()
                return FileVisitResult.CONTINUE
            }
        }
    )
}

然后,您可以像这样使用它:

import kotlin.io.path.Path
...
   Path(cacheDir).deleteRecursively()

并且如果它无法删除整个树,您将看到一个堆栈跟踪,其中包含一个异常和一条描述性消息。

**更新:**即将发布的Kotlin1.8.0将在其标准库中包含一个同名的实验函数。

a6b3iqyw

a6b3iqyw3#

谢谢你的支持。现在我让它工作了。问题是DownloadManager

val url = "$targetUrlFTP/$appName/$downloadingObject/$onlineVer.zip"
    val request = DownloadManager.Request(Uri.parse(url))
    request.setAllowedNetworkTypes((DownloadManager.Request.NETWORK_MOBILE or 
           DownloadManager.Request.NETWORK_WIFI))

    request.setDestinationInExternalFilesDir(this, cacheFolder.toString(), 
           zipFileName)

    val manager = getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
    downloadID = manager.enqueue(request)

request.setDestinationInExternalFilesDir(this, cacheFolder.toString(), zipFileName)线完全打乱了路径。
现在我有

cacheFolder = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)!!
zipFile = File(cacheFolder, zipFileName)
...
request.setDestinationUri(Uri.fromFile(zipFile))

一切正常甚至

private fun deleteFolder(fileOrDirectory : File){
    fileOrDirectory.deleteRecursively()
}

确实如此。
下一步是实现java.nio。谢谢Klitos更新你的帖子。我不知道如何使用它。

相关问题