点我去Gitee
点我去Gitee

plus.io手机文件内容获取、修改

plus.io 文件内容获取、修改

零、前言

最近在做一个需要对手机文件进行获取和修改的app,用到了h5+的plus.ioAPI,特此记录

一、文件在手机中的地址

https://www.cnblogs.com/biuo/p/15419167.html

二、文件获取

1.需要获取文件的页面.js

import getData from '../utils/getData'//方法:获取文件数据
componentDidMount() {
    //plusPredy准备工作  用于获取文件数据 
    if (window.plus) {//当有plus时,直接plusPredy
      this.plusready.bind(this)()
    } else {//当没有plus时,要先创造plusready事件
      document.addEventListener('plusready', this.plusready.bind(this), false)
    }
  }

  //plusready准备后   获取文件
  async plusready() {
    // 获取文件
    const txtData = await getData('config.txt') //根目录 好找 但android11以上可能不支持  这里用的是符合沙盒规范的目录
    const listData = (txtData && JSON.parse(txtData)) || [] //从文件获取下来的数据
}

2.文件获取方法.js

function getData(path) {
  return new Promise(resolve => {//文件读写是一个异步请求 用promise包起来方便使用时的async+await
    plus.io.requestFileSystem(plus.io.PUBLIC_DOCUMENTS, fs => {//请求文件系统
      fs.root.getFile(path, {//请求地址文件  '/storage/emulated/0/config.txt'为根目录  '/config.txt'为/storage/Android/data/io.dcloud.HBuilder(包名)/documents/config.js
        create: true//当文件不存在时创建
      }, fileEntry => {
        fileEntry.file(function (file) {
          let fileReader = new plus.io.FileReader()//new一个可以用来读取文件的对象fileReader
          fileReader.readAsText(file, 'utf-8')//读文件的格式
          fileReader.onerror = e => {//读文件失败
            console.log('获取文件失败', fileReader.error)
            plus.nativeUI.toast("获取文件失败,请重启应用", {
              background: '#ffa38c',
            })
            return
          }
          fileReader.onload = e => {//读文件成功
            let txtData = e.target.result
            resolve(txtData)////回调函数内的值想返回到函数外部  就用promise+resolve来返回出去
          }
        })
      }, error => {
        console.log('2新建获取文件失败', error)
        plus.nativeUI.toast("获取文件失败,请重启应用", {
          background: '#ffa38c',
        })
        return
      })
    },
      e => {
        console.log('1请求文件系统失败', e.message)
        plus.nativeUI.toast("请求系统失败,请重启应用", {
          background: '#ffa38c',
        })
        return
      }
    )
  }
  )
}

export default getData


三、给文件末尾增加信息

1.给文件添加信息的页面page.js

import addData from '../utils/addData.js' //方法:添加文件数据
// 添加数据
  async addData(boxId) {
    // 更新到文件
    await addData('config.txt', this.state.message)
  }

2.文件增加信息方法

function addData(path, writeData) {
  return new Promise(resolve => {//文件读写是一个异步请求 用promise包起来方便使用时的async+await
    plus.io.requestFileSystem(plus.io.PUBLIC_DOCUMENTS, fs => {//请求文件系统
      fs.root.getFile(path, {//请求地址文件 '/storage/emulated/0/config.txt'为根目录  '/config.txt'为/storage/Android/data/io.dcloud.HBuilder(包名)/documents/config.js
        create: true//当文件不存在时创建
      }, fileEntry => {
        fileEntry.file(file => {
          fileEntry.createWriter(writer => {
            plus.nativeUI.showWaiting('正在保存信息')
            writer.seek(writer.length - 2) //删除问价最后的结尾符号]
            const writeDataTemp = JSON.stringify(writeData, null, '\r').replace(/[\r]/g, '')//先在每行行头转行,再把每个转行删掉,得到的json格式才是即没有缩进,有转行了的
            if (writer.length > 2) {//如果文件原来有数据,则是添加数据条
              writer.write(',\n' + writeDataTemp + '\n]')
            }
            else {//如果文件原来没有数据,则是重新添加数据
              writer.write('[\n' + writeDataTemp + '\n]')
            }
            writer.onerror = function () {//写文件失败
              console.log('4写入文件失败', writer.error.message)
              plus.nativeUI.closeWaiting()
              plus.nativeUI.toast("添加信息失败,请重新操作", {
                background: '#ffa38c',
              })
              return
            }
            writer.onsuccess = function () { //写文件成功
              plus.nativeUI.closeWaiting()
              plus.nativeUI.toast("添加信息成功", {
                background: 'rgba(255, 255, 255, 0.6)',
              })
              resolve('1')//回调函数内的值想返回到函数外部  就用promise+resolve来返回出去
            }
          },
            error => {
              console.log('3创建creactWriter失败', error)
              plus.nativeUI.toast("保存文件失败,请重新操作", {
                background: '#ffa38c',
              })
              return
            })
        })
      },
        error => {
          console.log('2获取文件失败', error)
          plus.nativeUI.toast("保存文件失败,请重新操作", {
            background: '#ffa38c',
          })
          return
        }
      )
    }, e => {
      console.log('1请求文件系统失败', e.message)
      plus.nativeUI.toast("请求系统失败,请重新操作", {
        background: '#ffa38c',
      })
      return
    })
  })

}
export default addData

3.文件格式

四、重写文件

1.给文件重置信息的页面page.js

import changeData from '../utils/changeData.js' //方法:修改文件数据

// 修改数据 
  async changeData(boxId, index) {
    // 更新到文件
    await changeData('config.txt', 0, list)
  }

2.文件重置信息方法

function changeData(path, seek, writeData) {
  return new Promise(resolve => {
    plus.io.requestFileSystem(plus.io.PUBLIC_DOCUMENTS, fs => {
      fs.root.getFile(path, {
        create: true
      }, fileEntry => {
        fileEntry.file(file => {
          fileEntry.createWriter(writer => {
            plus.nativeUI.showWaiting('正在保存信息')
            writer.seek(seek) //覆盖文件
            const writeDataTemp = JSON.stringify(writeData, null, '\r').replace(/[\r]/g, '')
            writer.write(writeDataTemp) // 整个文件重写
            writer.onerror = function () {
              console.log('4写入文件失败', writer.error.message)
              plus.nativeUI.closeWaiting()
              plus.nativeUI.toast("修改信息失败,请重新操作", {
                background: '#ffa38c',
              })
              return
            }
            writer.onsuccess = function () { //填写文件成功
              plus.nativeUI.closeWaiting()
              plus.nativeUI.toast("修改信息成功", {
                background: 'rgba(255, 255, 255, 0.6)',
              })
              resolve('1')
            }
          },
            error => {
              console.log('3创建creactWriter失败', error)
              plus.nativeUI.toast("保存文件失败,请重新操作", {
                background: '#ffa38c',
              })
              return
            })
        })
      },
        error => {
          console.log('2获取文件失败', error)
          plus.nativeUI.toast("保存文件失败,请重新操作", {
            background: '#ffa38c',
          })
          return
        }
      )
    }, e => {
      console.log('1请求文件系统失败', e.message)
      plus.nativeUI.toast("请求系统失败,请重新操作", {
        background: '#ffa38c',
      })
      return
    })
  })
}
export default changeData

posted @ 2021-10-18 11:10  biuo  阅读(2711)  评论(0编辑  收藏  举报