根据官方文档,微信小程序本地文件分为:临时文件、缓存文件、用户文件。
按照官方文档,临时文件的删除机制由微信控制,只有以下两种情况才会被删除:
官方工作人员还说临时文件不能由开发者删除,如果可以删除的话,那也是 bug。
既然这样,为什么我还要教大家怎么删临时文件呢?
因为虽然不可以直接删除,但间接删除是可以的。
在了解删除方法之前,先了解为什么要删除?因为前面说了,临时文件最多只有 4GB 的空间,超过 4GB 再调用任何可以产生临时文件的接口,都会直接报错。另外,前面说超过 4GB 会自动删除,但只有在小程序结束运行后才会被删除,如果在用户使用过程中达到 4GB 小程序某些功能就没法用了,对用户体验影响是很大的。
可能会有人问,4GB 不少了,什么小程序会用掉 4GB 的空间啊?例如视频或图片处理类的小程序,比如下面这位开发者说的;
苹果手机不主动删除,缓存会越来越大,我这多次调用 wx.chooseVideo 方法后回调就不会成功了!请问这个怎么解决!
以下是删除临时文件的方法:
saveFile
把临时文件保存为缓存文件;getSavedFileList
获取缓存文件列表;removeSavedFile
删除缓存文件;另一种方法是:
为什么这两种方法可以间接地删除临时文件呢?因为根据文档,saveFile
保存临时文件时,会移动临时文件,调用成功后,临时文件路径将不可用,换言之,saveFile
本身就起到删除临时文件的作用。临时文件虽然不可直接删除,但缓存文件和用户文件都可以直接删除。
saveFile
可以指定保存目录,如果不指定就是保存为临时文件,如果指定就要以 ${wx.env.USER_DATA_PATH}/${fileName}
的格式指定。另外,不要使用 unlink
删除缓存文件,因为可能会提示没有权限,unlink
是用来删除用户文件的,即删除 ${wx.env.USER_DATA_PATH}
目录中的文件的。
需要注意的是,以上两种方法并不完美,因为缓存文件、用户文件加起来最多只能存储 200MB,如果临时文件体积太大,可能一个都 saveFile
不了。
//以下是方法一
fs.saveFile({
tempFilePath: path,
success(res) {
fs.removeSavedFile({
filePath: res.savedFilePath,
fail(err) {
console.log("删除文件出错:", res, err);
},
});
},
fail(err) {
console.log("保存文件出错:", err);
},
});
//以下是方法二
fs.saveFile({
tempFilePath: path,
filePath: `${wx.env.USER_DATA_PATH}/${fileName}`,
success(res) {
fs.unlink({
filePath: `${wx.env.USER_DATA_PATH}/${fileName}`,
fail(err) {
console.log("删除文件出错:", err);
},
});
},
fail(err) {
console.log("保存文件出错:", err);
},
});