【5+App Native.js】h5/uniapp 文件读写删操作(支持android和ios)

技术栈

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, '删除文件的报错')
		})
	}) */
}

猜你喜欢

转载自blog.csdn.net/qq_45481971/article/details/130294380