8***@qq.com
8***@qq.com
  • 发布:2018-12-30 13:44
  • 更新:2019-07-04 18:14
  • 阅读:2029

【报Bug】存储多个文件后调用删除后,获取文件列表还显示部分,实际已不存在

分类:uni-app

==========================================2018年12月30日 23:37:49
==========================================
多次测试发现
调试期间已确认uni.getSavedFileList会得到两个,
出现的操作步骤:
1.采用uni-app官方模版中【接口】->【网络】->【下载文件】模版改写,在下载方法中增加uni.saveFile()用于保存下载的图片,,增加一个删除方法如下,按钮调用,
del: function() {
uni.getSavedFileList({
success: function(res) {
console.log(res.fileList);
for (let i = 0; i < res.fileList.length; i++) {
console.log(res.fileList[i].filePath + "---" + res.fileList[i].size);
uni.removeSavedFile({
filePath: res.fileList[i].filePath,
complete: function(res) {
console.log(res);
}
});
}
}
});
}

2.点【下载】保存图片,然后删除,反复操作,或者下载保存图片,返回,在进入【下载文件】点【下载】反复操作几次后,获取uni.getSavedFileList会发现里面出现2个Object.实际已不存在
==========================================
==========================================

详细问题描述
[内容]
使用文件操作存储多个文件后调用uni.getSavedFileList获取全部后逐一uni.removeSavedFile删除后,获取文件列表还显示部分(如下载后保存文件,执行3次后,获取全部列表循环删除,之后再调用uni.getSavedFileList还是会显示有2个,uni.getFileInfo就发现实际不存在了,到手机文件管理中也确实没了),实际已不存在。
使用的模版hello uni-app中直接改的download-file.vue
del: function() {
uni.getSavedFileList({
success: function(res) {
console.log(res.fileList);
for (let i = 0; i < res.fileList.length; i++) {
console.log(res.fileList[i].filePath + "---" + res.fileList[i].size);
uni.removeSavedFile({
filePath: res.fileList[i].filePath,
complete: function(res) {
console.log(res);
}
});
}
}
});
}
先点删除按钮后再点查询全部调用uni.getSavedFileList发现还有缓存Array

控制台日志:
13:23:53.931 _doc/uniapp_save/1546095877008.png---4162 at pages/API/download-file/download-file.vue:111
13:23:53.951 _doc/uniapp_save/1546095877008.png at pages/API/download-file/download-file.vue:113
13:23:53.972 _doc/uniapp_save/1546147397152.png---4162 at pages/API/download-file/download-file.vue:111
13:23:53.992 _doc/uniapp_save/1546147397152.png at pages/API/download-file/download-file.vue:113
13:23:54.012 getFileInfo:fail:文件[_doc/uniapp_save/1546095877008.png]读取失败:路径不存在 at pages/API/download-file/download-file.vue:120
13:23:54.032 getFileInfo:fail:文件[_doc/uniapp_save/1546147397152.png]读取失败:路径不存在 at pages/API/download-file/download-file.vue:120
13:23:54.054 [object Object],[object Object] at pages/API/download-file/download-file.vue:94
13:23:54.073 ---undefined at pages/API/download-file/download-file.vue:108
13:23:54.094 _doc/uniapp_save/1546095877008.png---4162 at pages/API/download-file/download-file.vue:111
13:23:54.114 _doc/uniapp_save/1546095877008.png at pages/API/download-file/download-file.vue:113
13:23:54.136 _doc/uniapp_save/1546147397152.png---4162 at pages/API/download-file/download-file.vue:111
13:23:54.155 _doc/uniapp_save/1546147397152.png at pages/API/download-file/download-file.vue:113
13:23:54.176 getFileInfo:fail:文件[_doc/uniapp_save/1546095877008.png]读取失败:路径不存在 at pages/API/download-file/download-file.vue:120
13:23:54.198 getFileInfo:fail:文件[_doc/uniapp_save/1546147397152.png]读取失败:路径不存在 at pages/API/download-file/download-file.vue:120
13:26:30.573 App Hide at App.vue:40

IDE运行环境说明
[HBuilder 或 HBuilderX]
[IDE版本号]HBuilderX最新版
[windows版本号] win10
[mac版本号]

App运行环境说明
[Android版本号]
[iOS版本号]
[手机型号]小米6,note
[模拟器型号]Androidstudio带的

2018-12-30 13:44 负责人:无 分享
已邀请:

最佳回复

DCloud_UNI_GSQ

DCloud_UNI_GSQ

已修复,更新到 HBuilderX alpha 2.0.3 即可

8***@qq.com

8***@qq.com (作者)

编程侠

编程侠

我和你遇到了同样的问题

西北偏北

西北偏北

一模一样的问题,赶紧修复吧,现在只能处理成出错的情况默认当做是已经删除的文件了。。

西北偏北

西北偏北

经过不断测试,发现问题存在于在调用 新的文件列表之前,你必须非常确定的 删除了原来的文件(异步删除,有可能只是删除了文件,但是还没有把路径记录删除)。
所以所有删除原来文件之后的逻辑操作都要在 removeSavedFile的success回调里面去操作,这里用Promise会比较简单。

另外,调试时候,如果已经出现了找不到路径的情况,修改代码之后,切记删除HBuilder之后,重新安装再来测试新的代码,否则找不到的路径会一直存在。。

代码栗子:

const getSavedFileList = () => {  
  return new Promise((resolve, reject) => {  
    uni.getSavedFileList({  
      success: resolve,  
      fail: reject  
    })  
  })  
}  
const removeFile = (filePath) => {  
  return new Promise((resolve, reject) => {  
    uni.removeSavedFile({  
      filePath: filePath,  
      success: resolve,  
      fail: reject  
    })  
  })  
}  

// 彻底删除之前下载的所有文件  
const removeFiles = () => {  
  return getSavedFileList().then(async (res) => {  
    const fileList = [].concat(res.fileList)  
    const removeFilesAll = []  

    for (let fs of fileList) {  
      removeFilesAll.push(await removeFile(fs.filePath))  
    }  

    return Promise.all(removeFilesAll)  
  }).catch((e) => {  
    return Promise.reject(e)  
  })  
}  

// 调用可以这样:  
removeFiles.then(() => {  
  // 删除之后的逻辑代码  
})

该问题目前已经被锁定, 无法添加新回复