uniapp操作手机文件增删改查

由于最近uniapp项目需要调5+puls,来操作手机文件增删改查,于是入坑了native.js>android>IO,官网文档先献上
5+puls官网文档

首先介绍一下,我们存储空间有2种模式那就是沙盒模式和系统公共目录
我们这里用到的是沙盒模式,app的应用根目录以内存储空间(
、不需要授权也能访问,默认授权了)
我们的下载文件储存到手机的地址uni.saveFile()也是储存在沙盒模式下,

沙盒模式

app中plus.io可以访问如下路径变量中
PRIVATE_WWW: 应用私有资源目录常量
PRIVATE_DOC: 应用私有文档目录常量
PUBLIC_DOCUMENTS: 应用公共文档目录常量(下面例子用到的)
PUBLIC_DOWNLOADS: 应用公共下载目录常量

那么如果我想下app应用的根目录下新建文件或者新建目录怎么操作呢

export function createFlie(path,data) {
  return new Promise(resolve => {//这里封装了个是一个promise异步请求
    // plus.io.requestFileSystem是请求本地文件系统对象
    plus.io.requestFileSystem(
        plus.io.PUBLIC_DOCUMENTS, // 文件系统中的根目录下的DOCUMENTS目录
        fs => {
            // 创建或打开文件, fs.root是根目录操作对象,直接fs表示当前操作对象
            fs.root.getFile(path+'.json', {
                create: true // 文件不存在则创建
            }, fileEntry => {
                // 文件在手机中的路径
                // console.log(fileEntry.fullPath)
                fileEntry.createWriter(writer => {
                    // 写入文件成功完成的回调函数
                    writer.onwrite = e => {
                        console.log("写入本地文件成功");
                        resolve("写入本地文件")
                    };
                    // 写入数据
                    writer.write(JSON.stringify(data));
                })
            }, e => {
                console.log("getFile failed: " + e.message);
            });
        },
        e => {
            console.log(e.message);
        }
    );
  })
}
//查看我们新建的documents目录下的所有文件,或者删除指定文件
export function getFileList(path) {
    return new Promise(resolve => { //文件读写是一个异步请求 用promise包起来方便使用时的async+await
    //  io.dcloud.HBuilder 是真机调试的包名,,
    //"/storage/emulated/0/Android/data/io.dcloud.HBuilder/documents"
    //  如果要进行打包那么就要改成你打包包名,比如我的包名是uni.UNIACE0B00那就改成
    //  "/storage/emulated/0/Android/data/uni.UNIACE0B00/documents"
        plus.io.requestFileSystem(
            "/storage/emulated/0/Android/data/uni.UNIACE0B00/documents", //指定的目录
            function(entry) {
                var directoryReader = entry.createReader(); //获取读取目录对象
                directoryReader.readEntries(
                    function(entries) {
                        resolve(entries)
                        //entries目录是一个数字遍历就能得到文件了,如下
                        // for (var i = 0; i < entries.length; i++) {
                        //  //   entries[i].remove();  //这是删除指定的文件
                        //  console.log("文件信息:" + entries[i].name);
                        // }
                    },
                    function(err) {
                        uni.showToast({
                            title: "访问目录失败:" + err.message,
                            duration: 2000
                        })
                        console.log("访问目录失败");
                    });
            },
            function(err) {
                // uni.showToast({
                //  title: "访问指定目录失败:" + err.message,
                //  duration: 2000
                // })
                console.log("访问指定目录失败:" + err.message);
            });
    })
}
//查看目录下的某个指定文件
export function getFileData(path) {
    return new Promise(resolve => { //文件读写是一个异步请求 用promise包起来方便使用时的async+await
        plus.io.requestFileSystem(
            plus.io.PUBLIC_DOCUMENTS,
            fs => {
                fs.root.getFile(path + '.json', {
                    create: false
                }, fileEntry => {
                    fileEntry.file((file) => {
                        console.log("文件大小:" + file.size + '-- 文件名:' + file.name);
                        //创建读取文件对象
                        let fileReader = new plus.io.FileReader();
                        //以文本格式读取文件数据内容
                        fileReader.readAsText(file, 'utf-8');
                        //文件读取操作完成时的回调函数
                        fileReader.onloadend = (evt) => {
                            console.log(JSON.parse(evt.target.result),
                                'JSON.parse(evt.target.result)')
                            resolve(JSON.parse(evt.target.result))
                            // sURL = JSON.parse(evt.target.result).URL;

                        }
                    });
                }, e => {
                    console.log("getFile failed: " + e.message);
                });
            },
            e => {
                console.log(e.message);
            }
        );
    })
}

在页面调用时

import { createFlie,getFileData,getFileList } from '@/utils/localFile'

//新建文件
async customFlie() {
let fileName=123 //fileName为你要定义的字符串文件名,
let ballList=[0]   //ballList是你要存的json数据
    let resC = await createFlie(fileName, ballList)
}

async getlist() {
     //查看某个指定的目录下的所有文件文件
     let resFileList = await getFileList()
     //查看documents目录下的某个指定文件,比如123
     let fileName=123
     let resFileData = await getFileData(fileName)
}

上面就是操作沙盒文件的方法

系统的公共目录

那么延伸一下,如果要读取操作系统的公共目录文件方法如下

export function getFileList() {
    return new Promise(resolve => { 
    调用系统的目录文件用绝对路径在在沙盒模式的路径前+file://
        plus.io.resolveLocalFileSystemURL(
             "file:///storage/emulated/0/DCIM/Camera",, //系统公共本地相册
            function(entry) {
                var directoryReader = entry.createReader(); //获取读取目录对象
                directoryReader.readEntries(
                    function(entries) {
                        resolve(entries)
                        //entries目录是一个数字遍历就能得到文件了,如下
                        // for (var i = 0; i < entries.length; i++) {
                        //  //   entries[i].remove();  //这是删除指定的文件
                        //  console.log("文件信息:" + entries[i].name);
                        // }
                    },
                    function(err) {
                        console.log("访问目录失败");
                    });
            },
            function(err) {
                console.log("访问指定目录失败:" + err.message);
            });
    })
}

如果需要新建本地目录或者文件呢
5+plus 貌似没有提供api,需要用原生插件的方式
接下来是原生插件开发思路
android 9及以下除其他应用的内部空间不可以读写,其他任意目录的文件都可以读写。

安android 10如果 29<targetSdkVersion <30 可以在AndroidManifest.xml文件中application节点中加上android:requestLegacyExternalStorage="true”来关闭分区,
如果大于targetSdkVersion >30,equestLegacyExternalStorage="true”也会失效

并申请权限

<uses-permission android:name=“android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>
<uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE\"/>
<uses-permission android:name=“android.permission.READ_EXTERNAL_STORAGE\"/>

andorid 11+会强制执行分区存储。不允许应用读写操作非应用沙盒目录和系统公共目录下的资源文件。需要获取全部文件权限

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容