【5+App Native.js】h5/uniapp file read, write and delete operations (support android and ios)

technology stack

uniapp / native.js

background

The app side needs to implement file read, write and delete operations, and needs to support ios and android platforms

try

1. FileSystemManager uni.getFileSystemManager()
After practice, it does not support the app side at present, so it is abandoned
WeChat Mini Program official website: https://developers.weixin.qq.com/miniprogram/dev/api/file/wx.getFileSystemManager.html

2. NJS introduces the Android package,
only supports Android, not 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
}

3. Use NJS IO module to manage local file system
Compatible with Android/ios
official website: 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, '删除文件的报错')
		})
	}) */
}

Guess you like

Origin blog.csdn.net/qq_45481971/article/details/130294380