技术栈
uniapp / native.js
背景
App端需要实现文件的读写删操作, 需要支持ios和android平台
尝试
一. FileSystemManager uni.getFileSystemManager()
经过实践,目前不支持app端,遂放弃
微信小程序官网 : https://developers.weixin.qq.com/miniprogram/dev/api/file/wx.getFileSystemManager.html
二. NJS引入安卓包
仅支持安卓, 不支持ios
let dir = '/youning';
let pathUrl = '/youning_app/test.txt';
// #ifdef APP-PLUS
let environment = plus.android.importClass("android.os.Environment");
var sdRoot = environment.getExternalStorageDirectory(); //文件夹根目录
var File = plus.android.importClass("java.io.File");
var BufferedReader = plus.android.importClass("java.io.BufferedReader");
var FileReader = plus.android.importClass("java.io.FileReader");
var FileWriter = plus.android.importClass("java.io.FileWriter");
// #endif
// 文件写入
export const writeFile = function(res) {
// #ifdef APP-PLUS
// 一行一条文本
res = res + '\r\n';
console.log(res)
try {
//不加根目录创建文件(即用相对地址)的话directory.exists()这个判断一值都是false
console.log(sdRoot + dir) // /storage/emulated/0/my_app
let directory = new File(sdRoot + dir);
if (!directory.exists()) {
console.log('创建目录')
directory.mkdirs();
//创建目录
}
let file = new File(sdRoot + pathUrl);
console.log(file.exists())
if (!file.exists()) {
file.createNewFile();
//创建文件
}
let fos = new FileWriter(sdRoot + pathUrl, true);
fos.write(res);
fos.close();
return
true;
} catch (e) {
console.log(e);
return false;
}
return false;
//#endif
}
// 文件读取
export const readFile = function(call) {
//#ifdef APP-PLUS
let readFr = new File(sdRoot + pathUrl);
let txt = '';
try {
var reader = new BufferedReader(new FileReader(readFr))
// 我的需求是读取多行,所以把每行都读出来存在数组里
let arr = [];
let txt;
while ((txt = reader.readLine()) != null) {
arr.push(txt)
}
// 传入回调处理你的业务
console.log(arr, '文件读取啊啊啊啊啊,,,,,,,,,,')
call(arr)
} catch (e) {
console.log(e)
return '';
}
//#endif
}
// 文件删除
export const deleteFile = function() {
//#ifdef APP-PLUS
let file = new File(sdRoot + pathUrl);
console.log(file.exists())
console.log(file.isFile())
if (file.exists() && file.isFile()) {
return file.delete();
} else {
return false;
}
//#endif
}
三. 使用NJS IO模块管理本地文件系统
兼容安卓/ios
官网 : https://www.html5plus.org/doc/zh_cn/io.html
// 文件写入
export const writeFileIos = function(filename, data) {
plus.io.requestFileSystem(
plus.io.PUBLIC_DOCUMENTS, // 文件系统中的根目录
fs => {
// 创建或打开文件, fs.root是根目录操作对象,直接fs表示当前操作对象
let a = fs.root.toURL()
let dirPath = a + '/' + 'youning/' + filename + '.txt';
fs.root.getFile(dirPath, {
create: true // 文件不存在则创建
}, fileEntry => {
// 文件在手机中的路径
console.log(fileEntry.fullPath, '文件在手机中的路径')
fileEntry.createWriter(writer => {
// 写入文件成功完成的回调函数
// 写入数据
writer.write(JSON.stringify(data));
writer.onwrite = e => {
console.log("写入数据成功");
};
})
}, e => {
console.log("getFile failed: " + e.message);
});
},
e => {
console.log(e.message);
}
);
}
// 文件读取
export const readFileIos = function(filename) {
plus.io.requestFileSystem(plus.io.PUBLIC_DOCUMENTS, function(fs) {
// fs.root是根目录操作对象DirectoryEntry
let a = fs.root.toURL()
let dirPath = a + '/' + 'youning/' + filename + '.txt';
// /var/mobile/Containers/Data/Application/8D4886B0-4900-4B9E-99C5-BF53F72CB0BA/Documents/Pandora/documents/_documents/a/mayimei.txt
fs.root.getFile(dirPath, {
create: false
}, function(fileEntry) {
fileEntry.file(function(file) {
var fileReader = new plus.io.FileReader();
fileReader.readAsText(file, 'utf-8');
fileReader.onloadend = function(evt) {
var news = [];
var result = evt.target.result;
if (result != "")
console.log(result, '读取的内容啊啊啊啊')
callback({
state: 1,
message: "读取成功!",
data: result
});
}
});
});
})
}
// 文件删除
export const deleteFileIos = function(filename) {
plus.io.requestFileSystem(plus.io.PUBLIC_DOCUMENTS, function(fs) {
let a = fs.root.toURL();
let dirPath = a + '/' + 'youning/' + filename + '.txt';
fs.root.getFile(dirPath, {
create: false
},
function(fileEntry) {
// 删除这个地址对应的文件
fileEntry.remove(function(entry) {
console.log("删除文件成功")
}, function(e) {
console.log(e.message);
})
},
function(err) {
console.log(err, '删除失败啊啊啊')
}
)
})
// 下面这里是递归删除, 但实践删除不成功, 报"文件路径不存在", 暂不清楚原因
/* plus.io.requestFileSystem(plus.io.PUBLIC_DOCUMENTS, function(fs) {
// fs.root是根目录操作对象DirectoryEntry
let a = fs.root.toURL();
let dirPath = a + '/' + 'youning/' + filename + '.txt';
plus.io.resolveLocalFileSystemURL(dirPath, function(entry) {
//读取这个目录对象
var directoryReader = entry.createReader();
//读取这个目录下的所有文件
directoryReader.readEntries(function(entries) {
//如果有才操作
console.log(entries, 'entries')
if (entries.length > 0) {
//删除目录将会删除其下的所有文件及子目录 不能删除根目录,如果操作删除根目录
//将会删除目录下的文件及子目录,不会删除根目录自身。 删除目录成功通过succesCB
//回调返回,失败则通过errorCB返回。
entry.removeRecursively(function(entry) {
callback();
console.log('删除成功回调')
//删除成功回调
}, function(e) {
//错误信息
console.log(e.message + ' ?!')
})
}
})
}, function(e) {
console.log(e, '删除文件的报错')
})
}) */
}