uniapp本地文件读写操作

说明

主要是封装官方文档里面的
官方文档地址:https://www.html5plus.org/doc/zh_cn/io.html

最新整理

代码

/**
 * 获取文件,文件不存在会自动创建()
 * @param {Object} fileName 可以是文件名,也可以是/路径/文件名
 * @param {Object} dirEntry 文件对象,可以为空
 * @return 文件Entry
 */
export async function getFileEntryAsync(fileName,dirEntry){
	// console.log("[getFileEntryAsync]开始执行")
	return new Promise((resolve) => {
		plus.io.requestFileSystem(
			plus.io.PRIVATE_DOC, 
			function(fs) {
				// console.log("[getFileEntryAsync]fileName is :" + fileName)
				let entry = dirEntry || fs.root;
				entry.getFile(
					fileName, {create: true}, 
					function(fileEntry) {
						// console.log("[getFileEntryAsync] 执行完成")
						resolve(fileEntry);
					},function(ex){console.log(ex)}
				);
			}
		);
	})
}
 
/**
 * 获取文件夹,不存在会自动创建
 * @param {Object} dirName 
 */
export async function getDirEntryAsync(dirName) {
	return new Promise(async (resolve) => {
		plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function(fs) {
			fs.root.getDirectory(dirName, {
				create: true
			}, function(dirEntry) {
				resolve(dirEntry);
			})
		})
	})
}
 
/**
 * 获取通过fileEntry获取file,不存在会自动创建
 * @param {Object} fileName
 * @param {Object} dirEntry
 */
export async function getFileAsync(fileName, dirEntry) {
	// console.log("[getFileAsync]")
	return new Promise(async (resolve) => {
		let fileEntry = await getFileEntryAsync(fileName, dirEntry);
		fileEntry.file(function(file) {
			resolve(file);
		});
	})
}
 
/**
 * 读取文件中的内容
 * @param {Object} path
 * @param {Object} dirEntry
 */
export async function getFileContextAsync(path, dirEntry) {
	let deffered;
	let fileReader = new plus.io.FileReader();
	fileReader.onloadend = function(evt) {
		deffered(evt.target);
	}
	let file = await getFileAsync(path, dirEntry);
	fileReader.readAsText(file, 'utf-8');
	return new Promise((resolve) => {
		deffered = resolve;
	});
}
 
/**
 * 向文件中写入数据
 * @param {Object} path 要写入数据的文件的位置
 * @param {Object} fileContext 要写入的内容
 * @param {Object} dirEntry 文件夹,可不写使用默认
 */
export async function writeContextToFileAsync(path,fileContext, dirEntry) {
	let fileEntry =await getFileEntryAsync(path);
	let file =await getFileAsync(path);
	return new Promise((resolve) => {
		fileEntry.createWriter( async writer => {
			// 写入文件成功完成的回调函数
			writer.onwrite = e => {
				console.log("写入数据成功");
				resolve()
			};
			  // 写入数据
			writer.write(fileContext);
		})
	});
}

/**
 * 追加写入数据
 * @param {Object} path 要写入数据的文件的位置
 * @param {Object} fileContext 要写入的内容
 * @param {Object} dirEntry 文件夹,可不写使用默认
 */
export async function AddOnWrite(path,fileContext, dirEntry){
	let data = await getFileContextAsync(path,dirEntry);
	let fileEntry = await getFileEntryAsync(path);
	let file = await getFileAsync(path);
	return new Promise((resolve) => {
		fileEntry.createWriter( async writer => {
			// 写入文件成功完成的回调函数
			writer.onwrite = e => {
				console.log("写入数据成功");
				resolve(true)
			};
			  // 写入数据
			writer.write(data.result+fileContext);
		})
	});
}


/**
 * 判断文件是否存在
 * @param {Object} fileName
 * @param {Object} dirEntry
 */
export async function existFileAsync(fileName, dirEntry){
	return new Promise((resolve)=>{
		plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function(fs) {
			let entry = dirEntry || fs.root;
			let directoryReader = entry.createReader();
			directoryReader.readEntries(function(entries) {
				let isExist = entries.some(entry => entry.name === fileName);
				resolve(isExist);
			});
		});
	})
} 
 

/**
 * 遍历dirEntry,只遍历当前目录,深层次的目录暂不考虑
 * @param {Object} dirEntry 目录名,若是为空则为应用沙盒目录
 */
export async function iterateDirectory(dirEntry){
	if(dirEntry){
		var dir = await getDirEntryAsync(dirEntry);
	}
	return new Promise((resolve)=>{
		plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function(fs) {
			let entry = dir || fs.root;
			let directoryReader = entry.createReader();
			directoryReader.readEntries(function(entries) {
				// entries.forEach((item, idx, arr)=>{
				// 	if(idx===0) console.log("---------------"+entry.name+"目录-----------------");
				// 	console.log(idx+1, item.name);
				// 	if(idx===arr.length-1) console.log("---------------end-----------------");
				// })
				resolve(entries)
			}, function(e) {
				console.log("Read entries failed: " + e.message);
			});
		});
	})
}

调用

//删除方法
getDirEntryAsync('_doc/1').then((res)=>{
	removeFile(res,'222.txt');
})

之前整理的

创建或打开文件

//fileName 目录路径 dirEntry之前打开过的目录(没有则不填写)
function getFileEntry(fileName, dirEntry) {
	return new Promise((resolve,reject) => {
		plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function(fs) {
			let entry = dirEntry || fs.root;
			entry.getFile(fileName, {
				create: true
			}, function(fileEntry) {
				resolve(fileEntry);
			}, function(e) {
				reject(e);
			});
		});
	})
}

创建或打开目录

function getDirEntry(dirName) {
	return new Promise(async (resolve) => {
		plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function(fs) {
			fs.root.getDirectory(dirName, {
				create: true
			}, function(dirEntry) {
				resolve(dirEntry);
			})
		})
	})
}

获取文件数据对象 fileName文件名路径 dirEntry文件夹路径(可以不填)

function getFile(fileName, dirEntry) {
	return new Promise((resolve,reject) => {
		getFileEntry(fileName, dirEntry).then(fileEntry=>{
			fileEntry.file(function(file) {
				file.close();
				resolve(file);
			},function(e){
				file.close();
				reject('失败');
			});
		})
	})
}

获取文件内容 path文件路径 文件夹路径(可为空)

async function getFileContext(path, dirEntry) {
	let deffered;
	let fileReader = new plus.io.FileReader();
	fileReader.onloadend = function(evt) {
		deffered(evt.target);
	}
	let file = await getFile(path, dirEntry);
	fileReader.readAsText(file, 'utf-8');
	return new Promise((resolve) => {
		deffered = resolve;
	});
}

读取目录下所有文件

function getDirList(fileNamePath) {
	return new Promise((resolve, reject) => {
		let arr = [];
		plus.io.resolveLocalFileSystemURL(
			fileNamePath,
			function(entry) {
				var directoryReader = entry.createReader();
				directoryReader.readEntries(
					function(entries) {
						for (var i = 0; i < entries.length; i++) {
							// console.log("文件信息",entries[i].name);
							arr.push(entries[i].name);
						}
						// console.log(arr);
						resolve(arr);
						// console.log(JSON.person(entries))
					},
					function(e) {
						console.log('访问目录失败');
						reject(e)
					});
			},
			function(e) {
				console.log('访问指定目录失败');
				reject(e)
			});
	})
}

删除文件

function removeFlie(fliePath) {
	return new Promise((resolve, reject) => {
		plus.io.resolveLocalFileSystemURL(fliePath, function(entry) {
			entry.remove(function(entry) {
				resolve(true);
			}, function(e) {
				console.log('删除失败',e);
				reject(false)
			});
		}, function(e) {
			console.log('访问路径失败')
			reject(false)
		})
	})
}
posted @ 2022-12-15 23:04  天宁哦  阅读(3106)  评论(0)    收藏  举报