uniapps使用HTML5的io模块拷贝文件目录

最近在集成sqlite到uniapp的过程中,因为要将sqlite数据库预加载,所以需要使用HTML5的plus.io模块。使用过程中遇到了许多问题,比如文件路径总是解析不到等。尤其是应用私有文档目录'_doc'。

根据官方文档:

复制代码
为了安全管理应用的资源目录,规范对文件系统的操作,5+ API在系统应用目录的基础设计了应用沙盒目录, 分为私有目录和公共目录两种类型,私有目录仅应用自身可以访问,公共目录在多应用环境时(如小程序SDK)所有应用都可访问。

应用私有资源目录,对应常量plus.io.PRIVATE_WWW,仅应用自身可读
应用私有文档目录,对应常量plus.io.PRIVATE_DOC,仅应用自身可读写
应用公共文档目录,对应常量plus.io.PUBLIC_DOCUMENTS,多应用时都可读写,常用于保存应用间共享文件
应用公共下载目录,对应常量plus.io.PUBLIC_DOWNLOADS,多应用时都可读写,常用于保存下载文件

plus.io.PRIVATE_WWW表示'_www'目录,实际值为1;plus.io.PRIVATE_DOC表示"__doc"目录,实际值为2;

因此不能把他们简单等同,要看方法需要的参数类型是什么。如果需要的参数类型是number,就使用常量,如果类型是string,则使用具体url路径。

别的不说了先,官方文档还是得仔细读读,虽然存在5%的小错误,但是还是可以提供帮助。

上代码!

我的需求是将数据库文件fit_path_app.db从_www拷贝到__doc目录下。该文件在项目中位于/static/database目录下,我是直接把整个目录拷贝到doc/db/目录下。

关于doc为什么直接使用字符串而不是本地文件路径,因为我发现如果在初始化时使用本地文件路径会解析地址失败,但是直接使用字符串则不会。原因不详。

最终使用下面的方法,目前在uniapp真机运行和使用mumu模拟器的情况下测试拷贝成功了,实体机测试晚点再看看,应该也问题不大。

javascript 复制代码
<script>
	export default {
		onLaunch: function() {
			const sourcePath = plus.io.convertLocalFileSystemURL('_www/static/database');
			// const targetRootPath = plus.io.convertLocalFileSystemURL('_doc/')
			const targetRootPath = '_doc/'
			// const targetFilePath = plus.io.convertLocalFileSystemURL('_doc/fit_path_app.db')
			const targetFilePath = 'db/'
			const paths = {
				source: sourcePath,
				targetRoot: targetRootPath,
				targetFile: targetFilePath
			}
			console.log('源和目标路径:',JSON.stringify(paths));
			
			plus.io.resolveLocalFileSystemURL(sourcePath,function(srcEntry) {
				plus.io.resolveLocalFileSystemURL(targetRootPath,function(targetEntry) {
					// 拷贝
					srcEntry.copyTo(targetEntry,targetFilePath,function(entry) {
						console.log('拷贝成功:',entry.fullPath);
					},function(e) {
						conso.error('拷贝失败:',JSON.stringify(e));
					})
				}, function(e){
					console.error('解析目标地址失败:',JSON.stringify(e))
				})
			}, function(e) {
				console.error('解析源地址失败:',JSON.stringify(e))
			})
			console.log('Database initialized successfully.');
			console.log('App Launch')
		},
		onShow: function() {
			console.log('App Show')
		},
		onHide: function() {
			console.log('App Hide')
		}
	}
</script>
相关推荐
申朝先生4 小时前
面试的时候问到了HTML5的新特性有哪些
前端·信息可视化·html5
靠近彗星10 小时前
Django:构建高性能Web应用
前端·python·django·sqlite
测试盐10 小时前
django入门教程之templates和static资源【五】
数据库·django·sqlite
hzw051010 小时前
Django 迁移中会删除数据的危险命令
数据库·django·sqlite
知识分享小能手13 小时前
CSS3学习教程,从入门到精通,CSS3 弹性盒子(Flexbox)布局全面指南(20)
前端·javascript·css·学习·css3·html5·前端开发
齐尹秦17 小时前
HTML5 新的 Input 类型学习笔记
前端·html5
奔跑吧邓邓子1 天前
【商城实战(74)】数据采集与整理,夯实电商运营基石
springboot·uniapp·element plus·商城实战·商城数据采集与整理
明月看潮生1 天前
青少年编程与数学 02-012 SQLite 数据库简介 01课题、数据库概要
数据库·青少年编程·sqlite·编程与数学
患得患失9491 天前
【后端】【Django orm】多对多关系建议使用自定义中间表,避免语义不清晰
数据库·django·sqlite
明月看潮生1 天前
青少年编程与数学 02-012 SQLite 数据库简介 03课题、数据库语言
数据库·青少年编程·sqlite·编程与数学