logo科技微讯

微信小程序删除临时文件的方法

作者:科技微讯
日期:2025-02-15
📝 笔记

根据官方文档,微信小程序本地文件分为:临时文件、缓存文件、用户文件。

按照官方文档,临时文件的删除机制由微信控制,只有以下两种情况才会被删除:

  • 临时文件最多可存储 4GB,超过 4GB 会被清理到 2GB 以下,不足 2GB 不会被清理;
  • 如果用户使用的所有小程序的临时文件加起来超过 6GB,会以小程序为维度删除临时文件,意味着某款小程序的临时文件可能会被直接清空;

官方工作人员还说临时文件不能由开发者删除,如果可以删除的话,那也是 bug。

既然这样,为什么我还要教大家怎么删临时文件呢?

因为虽然不可以直接删除,但间接删除是可以的。

在了解删除方法之前,先了解为什么要删除?因为前面说了,临时文件最多只有 4GB 的空间,超过 4GB 再调用任何可以产生临时文件的接口,都会直接报错。另外,前面说超过 4GB 会自动删除,但只有在小程序结束运行后才会被删除,如果在用户使用过程中达到 4GB 小程序某些功能就没法用了,对用户体验影响是很大的。

可能会有人问,4GB 不少了,什么小程序会用掉 4GB 的空间啊?例如视频或图片处理类的小程序,比如下面这位开发者说的

苹果手机不主动删除,缓存会越来越大,我这多次调用 wx.chooseVideo 方法后回调就不会成功了!请问这个怎么解决!

以下是删除临时文件的方法:

  1. 使用 saveFile 把临时文件保存为缓存文件;
  2. 使用 getSavedFileList 获取缓存文件列表;
  3. 使用 removeSavedFile 删除缓存文件;

另一种方法是:

  1. 使用 saveFile 把临时文件保存为用户文件;
  2. 使用 unlink 删除用户文件;

为什么这两种方法可以间接地删除临时文件呢?因为根据文档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);
  },
});
donation赞赏
thumbsup0
thumbsdown0
暂无评论