Hbuilder打包H5开发的App读取写⼊⼿机本地⽂件
在平时开发的html页⾯中,我们写的Js是没有读取⽤户电脑本地⽂件的权限的,这是出于浏览器运⾏时的安全考虑的,但在我们在使⽤h5打包app时,如果再像浏览器上让⽤户下载,上传⽂件,就会使⽤户的使⽤体验远不如电脑上操作,⽽且经常会有⼀些想要缓存本地的数据,cookies太⼩,满⾜不了需求,所以就想到能不能有内容时,我能直接操作⼿机的存取,我使⽤的是hbuilder打包app的,所以到官⽹上,就到了有⼀节专门关于io的介绍,研究了⼀下使⽤⽅法,所以特此记录⼀下
本⽂所参考官⽅⽂档
先明确⼏个主要对象及⽅法,这⾥与java⾥的对照来看,会java的朋友可能会更容易理解
请求本地⽂件系统对象的⽅法,获取指定的⽂件系统,可通过type指定获取⽂件系统的类型。获取指定的⽂件系统对象成功通过succesCB回调返回,失败则通过errorCB返回。
参数:
type: ( Number )必选本地⽂件系统常量
可取plus.io下的常量,如plus.io.PRIVATE_DOC、plus.io.PUBLIC_DOCUMENTS等。
succesCB: (  )必选请求⽂件系统成功的回调
errorCB: (  )可选请求⽂件系统失败的回调
注意,这⾥的type取值共4个,对应于不同的空间,也有不同的访问权限限制,⼀定要注意区分,如果读取或写⼊⽂件时报错时,记得检查这个地⽅,以下为原⽂
为了安全管理应⽤的资源⽬录,规范对⽂件系统的操作,5+ API在系统应⽤⽬录的基础设计了应⽤沙盒⽬录,分为私有⽬录和公共⽬录两种类型,私有⽬录仅应⽤⾃⾝可以访问,公共⽬录在多应⽤环境时(如⼩程序SDK)所有应⽤都可访问。
应⽤私有资源⽬录,对应常量,仅应⽤⾃⾝可读
应⽤私有⽂档⽬录,对应常量,仅应⽤⾃⾝可读写
应⽤公共⽂档⽬录,对应常量,多应⽤时都可读写,常⽤于保存应⽤间共享⽂件
应⽤公共下载⽬录,对应常量,多应⽤时都可读写,常⽤于保存下载⽂件
⽂件系统中的⽬录对象,⽤于管理特定的本地⽬录或者⽂件,对应于java中可以理解为File对象,这是操作⽂件最基础的对象,⼀个directoryEntry对象就对应于⼀个⽂件或⽂件夹
属性:
: 操作对象的是否为⽂件,DirectoryEntry对象固定其值为false
: 操作对象是否为⽬录,DirectoryEntry对象固定其值为true
: ⽬录操作对象的名称,不包括路径
: ⽬录操作对象的完整路径,⽂件系统的绝对路径
: ⽂件操作对象所属的⽂件系统对象,参考FileSystem
⽅法:
: 获取⽬录的属性
: 移动⽬录
: 拷贝⽬录
: 获取⽬录路径转换为URL地址
:
获取⽬录路径转换为本地路径URL地址
: 获取⽬录路径转换为⽹络路径URL地址
: 删除⽬录
: 获取⽬录所属的⽗⽬录
: 创建⽬录读取对象
: 创建或打开⼦⽬录
: 创建或打开⽂件
: 递归删除⽬录
⽂件系统中的⽂件对象,⽤于管理特定的本地⽂件,对应于java中可以理解为File对象
属性:
: ⽂件操作对象的是否为⽂件,FileEntry对象固定其值为true
:
⽂件操作对象是否为⽬录,FileEntry对象固定其值为false
: ⽂件操作对象的名称,不包括路径
: ⽂件操作对象的完整路径,⽂件系统的绝对路径
: ⽂件操作对象所属的⽂件系统对象,参考FileSystem
⽅法:
: 获取⽂件的属性信息
: 移动⽂件
: 拷贝⽂件
: 获取⽂件路径转换为URL地址
: 获取⽂件路径转换为本地路径URL地址
: 获取⽂件路径转换为⽹络路径URL地址
:
删除⽂件
: 获取⽂件所属的⽗⽬录
: 获取⽂件关联的写⽂件操作对象FileWriter
: 获取⽂件数据对象
创建读取⽂件对象,主要是⽂件读取相关的操作,⽂件以⽂本或者Base64编码的字符串形式读出来,对应于java中可理解为InputStream
属性:
: 当前读取⽂件所处的状态
: 已读取⽂件的内容
: ⽂件操作错误代码
⽅法:
: 终⽌⽂件读取操作
: 以URL编码格式读取⽂件数据内容
: 以⽂本格式读取⽂件数据内容
事件:
: 读取⽂件开始时的回调函数
: 读取⽂件成功完成的回调函数
: 取消读取⽂件时的回调函数
: ⽂件读取操作失败时调⽤的回调函数
: ⽂件读取操作完成时的回调函数
⽂件系统中的写⽂件对象,⽤于写⼊⽂件内容,⽤户注册⾃⼰的事件来接收writestart、progress、write、writeend、error和abort事件,⼀个FileWriter 对象是为单个⽂件的操作⽽创建,可以使⽤该对象多次对相应⽂件进⾏写⼊操作。 FileWriter维护该⽂件的指针位置及长度属性,这样就可以寻和写⼊⽂件的任何地⽅。默认情况下,FileWriter从⽂件的开头开始写⼊(将覆盖现有数据),
seek⽅法可设置⽂件操作指定位置,如fw.seek(fw.length-1)写⼊操作就会从⽂件的末尾开始,对应于java中理解为OutputStream
属性:
: 当前写⼊⽂件所处的状态
: ⽂件当前的长度,单位为字节
: ⽂件当前操作的指针位置
: ⽂件写⼊操作错误代码
⽅法:
: 终⽌⽂件写⼊操作
: 定位⽂件操作位置
: 按照指定长度截断⽂件
: 向⽂件中写⼊数据
事件:
: 写⼊⽂件开始时的回调函数
: 写⼊⽂件成功完成的回调函数
: 取消写⼊⽂件时的回调函数
: ⽂件写⼊操作失败时调⽤的回调函数
: ⽂件写⼊操作完成时的回调函数
下⾯是读写⽂件的主要代码及说明
1、获取⽂件读写的基础,FileEntry对象
1//读取应⽤公共⽂档⽬录
2    questFileSystem(plus.io.PUBLIC_DOCUMENTS, function(fs) {
3// 通过fs.root获取DirectoryEntry对象进⾏操作,获取⽂件操作的根⽬录
4//这⾥的filePath即你要读取的⽂件所在的相对路径,可随意定义,但不得是 _www开头,因为_www开头是应⽤私有资源⽬录的专⽤,只有读权限,不能写⼊,写⼊时会报错
5var filePath = 'abc/';
6var rootDirectoryEntry = fs.root;
7        File(filePath, {
8//这个参数的作⽤是指⽰如果⽂件或⽬录不存在时是否进⾏创建,默认值为false,设为true表⽰如果这个filePath下的⽂件不存在就创建,当然,如果存在就直接返回,不会创建
9            create: true
10        }, function(fileEntry) {
11//FileEntry对象获取成功,对应就是⽂件了,可以接着进⾏相应的读写操作了
12
13        }, function(e) {
14            console.ssage);
15        });
16    }, function(e) {
17        console.ssage);
18    });
2、在上⼀步获取到⽂件操作对象FileEntry的基础上,开始读操作
1//获取⽂件
2    fileEntry.file(function (file) {
3//console.log(file.size + ' <--> ' + file.name);
4//创建⼀个⽂件读取⼯具,在java中理解就是InputStream输⼊流
5        var fileReader = new plus.io.FileReader();
6//成功读取到⽂件内容时的回调,其中sult就是⽂件中的⽂本内容
7        loadend = function (evt) {
8            console.log(sult);
9        }
10//⽂件读取操作失败时调⽤的回调函数
11        r = function (e) {
12            console.ssage);
13        }
14//将刚才请求到的⽂件以utf-8编码,⽂本的形式读出
15        adAsText(file, 'utf-8');
16    });
3、还是以⽂件操作对象FileEntry为基础,进⾏写⼊⽂件的操作
1//通过fileEntry的createWriter创建输出流,向⽂件写⼊内容,对应java中的OutputStream
2    ateWriter(writer => {
3//⽂件写⼊成功后的回调
4        write = function(event) {
5//写⼊成功
6            console.log('写⼊成功');
7        }
8//⽂件写⼊操作失败时调⽤的回调函数
9        r = function(e) {
10            console.ssage);
11        }
12//设置⽂件写⼊的起点,writer.length就是上次⽂件⾥⾯内容的最后位置,这样即将新的内容追加到⽂本最末尾,如果想覆盖原先的内容,直接设置为0即可
13        var cursor =  writer.length;
14        writer.seek(cursor);
15//将要写⼊的⽂本dataStr写⼊到⽂件中去
16        writer.write(dataStr);
17    }, function(e) {
18        console.ssage);
19    });
以上就是在Hbuilder中打包H5的App读写⽂件的主要代码了及功能了
但是我们发现这样写会有⽆数的回调函数,不仅不好看,别⼈调⽤时也不好传参,所以我们可以采⽤ES6的写法加上Primse来封装改造⼀下,让这些⽅法看起来更加优雅⼀点
1    getFileEntry(filePath) {
2return new Promise((resolve, reject) => {
3            questFileSystem(plus.io.PUBLIC_DOCUMENTS, fs => {
4                File(filePath, {create: true}, fileEntry => {
5                    resolve(fileEntry);
6                }, e => {
7                    reject(e)
8                });
9            }, e => {
10                reject(e)
11            });
12        })
13    },
14    readData(fileEntry) {
15return new Promise((resolve, reject) => {
16            fileEntry.file(function (file) {
17                let fileReader = new plus.io.FileReader();
18                loadend = function (evt) {
19                    resolve(sult);
20                }
21                r = function (e) {
22                    reject(e)
23                }
24                adAsText(file, 'utf-8');
25            });
26        })
27    },
28    writeData(fileEntry, dataStr, cursorStart) {
29return new Promise((resolve, reject) => {
30            ateWriter(writer => {
31                write = e => {
32                    resolve()
33                }
34                r = e => {
35                    reject(e)
36                }
37//设置⽂件写⼊的起点
38                let length = cursorStart != undefined ? cursorStart : writer.length;
39                writer.seek(length);
40                writer.write(dataStr);
41            }, e => {
42                reject(e)
43            });
44        })
45    }
这样在调⽤时,代码就会⾮常简洁了
读取⽂件内容
1    let filePath = '/abc/haha/test.json';
3    .then(fileEntry => {
4// ve();    //删除⽂件
adData(fileEntry);
6    }).then(fileText => {
7        alert("⽂件内容:>>> " + fileText)手机上可以打html与css的app
8    }).catch(e => {
9        alert('⽂件读取失败!')
10    })
写⼊⽂件内容
1    let writeDataStr = 'Hello World!!!'
3    .then(fileEntry => {
4return this.writeData(fileEntry, writeDataStr);
5    }).then(writer => {
6        alert('保存成功');
7    }).catch(e => {
8        alert('保存失败!')
9    })
OK ! 打完收⼯

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。