小程序读取项目内文件可以用下面的方法
const fs = wx.getFileSystemManager()
const ab = new ArrayBuffer(1024)
// 打开文件
fs.open({
filePath: `${wx.env.USER_DATA_PATH}/hello.txt`,
flag: 'a+',
success(res) {
// 读取文件到 ArrayBuffer 中
fs.read({
fd: res.fd,
arrayBuffer: ab,
length: 10,
success(res) {
console.log(res)
}
})
}
})
是不可能的!!!
读取项目内文件-失败
项目内文件路径是src/pinyin.js
,文件是167k,当后缀为txt的时候,预览/打包的时候直接就给忽略掉了~不愧是微信
网上有一种方法,这个hello.txt只有几个字
const src = 'hello.txt';
const destination = wx.env.USER_DATA_PATH + '/CH1949BST.txt'
fs.copyFile({ //先把文件复制到可操作的文件夹
srcPath: src, //源文件
destPath: destination, //可操作的文件夹路径
success: res => {
console.log(res) //复制成功返回res信息
fs.readFile({ //读取文件
filePath: destination,
encoding: 'utf-8',
success: res => {
console.log(res.data)
},
fail: console.error
})
},
fail: console.error //复制失败返回error
})
事实是{errMsg: "access:fail no such file or directory, access "/hello.txt""}
后来在这里看到,老版本的开发工具可以用,新版本这个API就不能用了,官方没人回应,不愧是微信~
从项目内读取文件宣告失败。
从云端读取
看到另一种方法,尝试把文件放在云端,下载下来后再读取。此法可行。
- 上传,打开云开发-存储-上传文件,上传成功后自动生成File ID,复制下来。
-
下载和读取,调用下面的方法就行
//arraybuffer转字符串 arrayBufferToString: function (arr) { if (typeof arr === 'string') { return arr; } var dataview = new DataView(arr.data); var ints = new Uint8Array(arr.data.byteLength); for (var i = 0; i < ints.length; i++) { ints[i] = dataview.getUint8(i); } arr = ints; var str = '', _arr = arr; for (var i = 0; i < _arr.length; i++) { var one = _arr[i].toString(2), v = one.match(/^1+?(?=0)/); if (v && one.length == 8) { var bytesLength = v[0].length; var store = _arr[i].toString(2).slice(7 - bytesLength); for (var st = 1; st < bytesLength; st++) { store += _arr[st + i].toString(2).slice(2); } str += String.fromCharCode(parseInt(store, 2)); i += bytesLength - 1; } else { str += String.fromCharCode(_arr[i]); } } return str; }, onLoad: function () { wx.cloud.downloadFile({ fileID: 'cloud://test-yzigm.7465-test-yzigm-1301211810/pinyin.txt', success: res => { wx.getFileSystemManager().readFile({ filePath: res.tempFilePath, success: res => { const result = this.arrayBufferToString(res) console.log(result); }, fail: error => { debugger } }) console.log(res) }, fail: error => { debugger } }) }
ArrayBuffer和String相互转换的方法来自这里