uni.clearStorageSync()仅清除键值对,清理垃圾文件需手动遍历删除;uni.removeSavedFile()不支持批量,须先用uni.getSavedFileList()获取列表并分批(5–10个并发)调用;日志文件须用plus.io操作,图片和WebView缓存需条件编译#ifdef APP-PLUS。

直接调用 uni.clearStorageSync() 不会清理“垃圾文件”,它只清 uni.setStorage 写入的键值对。App 端真正要删的图片、下载文件、日志等,全得手动遍历 + 分批删除,否则残留严重且容易崩溃。
为什么 uni.removeSavedFile() 单独调用没用
这个 API 必须传具体 filePath,不支持通配符或批量删。你写 uni.removeSavedFile({filePath: 'xxx.jpg'}) 只能删一个文件,而用户可能通过 uni.downloadFile、uni.saveFile 或插件保存了几十个临时文件。
- 必须先用
uni.getSavedFileList()拿到完整列表,再逐个处理 - 不能直接
forEach一把梭:iOS 上并发太多会触发EMFILE: too many open files错误,App 卡死 - 推荐每次最多并发 5–10 个,用
Promise.all(fileList.slice(i, i+5).map(...))控制节奏 - 删完别忘了验证:再调一次
uni.getSavedFileList()看 length 是否归零
日志文件必须用 plus.io,不是 uni.getFileSystemManager()
如果你把日志写在 plus.io.getCacheDir()(比如 app-20261029.log),uni.getFileSystemManager() 根本读不到——它对这个路径无权限。必须用原生接口:
- 先
plus.io.readdir({ path: plus.io.getCacheDir() })列出所有文件 - 对每个文件名做判断:是否含
log、后缀是.log、或匹配自定义规则(如^crash_.*\.log$) - 再用
plus.io.remove(path)删除;注意它也不返回 Promise,得靠回调链或Promise.allSettled()包裹 - 加时间过滤:只删 7 天前的,避免删掉正在写入的日志导致锁文件残留
图片缓存和 WebView 缓存必须条件编译
uni.clearImageCache() 和 plus.cache.clear() 在 H5 和小程序里静默失败,不报错也不生效。不加编译包裹,App 端逻辑就白写了。
- 必须用
#ifdef APP-PLUS包住,例如: uni.clearImageCache();const cache = uni.requireNativePlugin('plus.cache');cache.clear(() => console.log('WebView 缓存已清'));- 别指望它们能清 OkHttp/CFNetwork 层磁盘缓存——那是 HTTP 协议层的事,得靠服务端响应头
Cache-Control: no-store控制
最容易被忽略的是:日志路径可能被 Android 厂商重定向,plus.io.getCacheDir() 比硬写 uni.env.USER_DATA_PATH 更稳定;另外删文件时没关写入流、没控制并发数、没验证结果,都会让“一键清理”变成“伪清理”。


















