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>
相关推荐
青桔柠薯片30 分钟前
数据库编程:从SQLite基础到C语言集成
linux·数据库·学习·sqlite
我命由我123452 小时前
React - React 初识、创建虚拟 DOM 的两种方式、jsx 语法规则、React 定义组件
前端·javascript·react.js·前端框架·html·html5·js
’长谷深风‘3 小时前
从零开始学 SQLite:从基础命令到 C 语言编程实战
c语言·数据库·sqlite·软件编程
Hello.Reader3 小时前
Flutter IM 桌面端消息发送、ACK 回执、SQLite 本地缓存与断线重连设计
flutter·缓存·sqlite
酉鬼女又兒5 小时前
零基础入门Web应用开发(备赛蓝桥杯)_网页布局原理
前端·职场和发展·蓝桥杯·html5
我命由我123456 小时前
前端开发 - this 指向问题(直接调用函数、对象方法、类方法)
开发语言·前端·javascript·vue.js·react.js·html5·js
我命由我123457 小时前
React - ref、回调 ref 回调执行次数的问题、createRef 函数、事件处理
前端·javascript·react.js·前端框架·html·html5·js
我命由我123457 小时前
React - 收集表单元素、收集表单元素优化、生命周期(旧)、生命周期(新)
前端·javascript·react.js·前端框架·html·html5·js
creaDelight7 小时前
编写你的第一个 Django 应用(官网demo)
python·django·sqlite
洛克大航海8 小时前
SQLite 的安装
数据库·sqlite