[uniapp] 文件系统操作

时间:2025-03-20 12:58:07

 在使用uniapp进行ios和android开发时,有可能需要对文件进行操作,比如:创建文件夹和文件,删除文件等。这些操作必须调用相关的API才行,并且这些API是都异步操作的,在我们的业务中,有时又必须同步处理才行,所以我将所有的操作进行了同步化的处理,将代码抽到一个名为的文件中,通过ES6的方式导出方法,然后在vue文件中直接导入使用即可。代码如下,代码分为同步和异步两部分,各自根据需要使用即可:

// -------------------------------------默认的异步操作------------------------------
export function getDirectory(directoryName,successCB){
	( 
		.PRIVATE_DOC, 
		function( fs ) {
			//directoryName:可以是一个文件名,如果是路径,则路径上的所有文件夹都会自动创建
			(directoryName, {create:true},successCB, function(){} );
			("创建完成.............")
		}, 
		function ( e ) {} 
	);
}

export function getFile(filePath,successCB){
	( 
		.PRIVATE_DOC, 
		function( fs ) {
			//directoryName:可以是一个文件名,如果是路径,则路径上的所有文件夹都会自动创建
			(filePath, {create:true},successCB, function(){} );
			("创建完成.............")
		}, 
		function ( e ) {} 
	);
}

export function moveFile(srcFilePath,srcFileName,dstFilePath,dstFileName,successCB){
	( "_documents/b1/", function( entry ){
		("_doc/", function(root){
			/* ( 
				root, 
				"", 
				function( entry ){
					("New Path: " + );
				},
				function( e ){
					( "错1误"+(e) );
				}
			); */
			(
				root, 
				"", 
				function( entry ){
					("New Path: " + );
				},
				function( e ){
					( "错1误"+(e) );
				}
			); 
		})
	})
}

export function copyFile(srcFilePath,srcFileName,dstFilePath,dstFileName,successCB){
	( "_documents/b1/", function( entry ){
		("_doc/", function(root){
			( 
				root, 
				"", 
				function( entry ){
					("New Path: " + );
				},
				function( e ){
					( "错1误"+(e) );
				}
			);
		})
	})
}

/**
 * 传入目录dirEntry,如果传了fileName,则删除对应文件,否则目录下所有文件全部删除
 * @param {Object} dirEntry
 * @param {Object} fileName
 */
export function removeFile(dirEntry, fileName) {
	(.PRIVATE_DOC, function(fs) {
		let entry = dirEntry || ;
		let directoryReader = ();
		(function(entries) {
			for (let i =  - 1; i >= 0; i--) {
				if (fileName) {
					if (fileName === entries[i].name) {
						("删除文件", entries[i].name);
						entries[i].remove();
					}
				} else {
					entries[i].remove();
				}
			}
		});
	});
}


// ----------------------------------------------------------------同步化-操作-----------------------------------------
/**
 * 同步化获取文件,文件不存在会自动创建
 * @param {Object} fileName 可以是文件名,也可以是/路径/文件名
 * @param {Object} dirEntry
 * @return 文件Entry
 */
export async function getFileEntryAsync(fileName,dirEntry){
	("[getFileEntryAsync]开始执行")
	return new Promise((resolve) => {
		(
			.PRIVATE_DOC, 
			function(fs) {
				("[getFileEntryAsync]fileName is :" + fileName)
				let entry = dirEntry || ;
				(
					fileName, {create: true}, 
					function(fileEntry) {
						("[getFileEntryAsync] 执行完成")
						resolve(fileEntry);
					},function(ex){(ex)}
				);
			}
		);
	})
}

/**
 * 获取文件夹,不存在会自动创建
 * @param {Object} dirName 
 */
export async function getDirEntryAsync(dirName) {
	return new Promise(async (resolve) => {
		(.PRIVATE_DOC, function(fs) {
			(dirName, {
				create: true
			}, function(dirEntry) {
				resolve(dirEntry);
			})
		})
	})
}

/**
 * 获取通过fileEntry获取file,不存在会自动创建
 * @param {Object} fileName
 * @param {Object} dirEntry
 */
export async function getFileAsync(fileName, dirEntry) {
	("[getFileAsync]")
	return new Promise(async (resolve) => {
		let fileEntry = await getFileEntryAsync(fileName, dirEntry);
		(function(file) {
			resolve(file);
		});
	})
}

/**
 * 读取文件中的内容
 * @param {Object} path
 * @param {Object} dirEntry
 */
export async function getFileContextAsync(path, dirEntry) {
	let deffered;
	let fileReader = new ();
	 = function(evt) {
		deffered();
	}
	let file = await getFileAsync(path, dirEntry);
	(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) => {
		( async writer => {
			// 写入文件成功完成的回调函数
			 = e => {
				("写入数据成功");
				resolve()
			};
			  // 写入数据
			((fileContext));
		})
	});
}

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

/**
 * 遍历dirEntry,深层次的目录暂不考虑
 * @param {Object} dirEntry
 */
export async function iterateDierctory(dirEntry) {
	return new Promise((resolve) => {
		(.PRIVATE_DOC, function(fs) {
			let entry = dirEntry || ;
			let directoryReader = ();
			(function(entries) {
				((item, idx, arr)=>{
					if(idx===0) ("---------------"++"目录-----------------");
					(idx+1, );
					if(idx===-1) ("---------------end-----------------");
				})
				resolve(entries);
			}, function(e) {
				("Read entries failed: " + );
			});
		});
	})
}

/* 调用例子
this.DIR_NAME = 'test'
fileName = ''
filePath = '_doc/test/'
let dirEntry = await (this.DIR_NAME); //创建、获取文件夹
let fileEntry = await (fileName, dirEntry); // 创建、获取文件
let {result:content} = await (filePath); // 获取文件的内容
let trajectory = (content||"[]");
({lat, lng});
(function(writer){
	(0);
	((trajectory));
}); */

有了同步化的方法后,在vue问价中写业务时就不需要使用回调方法或者then了。