• 【鸿蒙学习笔记】文件管理


    官方文档:Core File Kit简介

    文件分类

    1. 应用文件

    文件所有者为应用,比如应用的安装包,自己的资源文件等。

    2. 用户文件

    文件所有者为用户,比如用户自己的照片,录制的音视频等。
    在这里插入图片描述

    应用沙箱目录

    应用沙箱是一种以安全防护为目的的隔离机制,避免数据受到恶意路径穿越访问。在这种沙箱的保护机制下,应用可见的目录范围即为“应用沙箱目录”。这个目录包含:应用文件目录和一部分系统文件目录,这俩目录的合集,就是应用沙箱目录。
    在这里插入图片描述

    应用文件目录

    在这里插入图片描述

    1. 一级目录data/:代表应用文件目录。
    2. 二级目录storage/:代表本应用持久化文件目录。
    3. 三级目录el1/el2/:代表不同文件加密类型。
      el1,设备级加密区:设备开机后即可访问的数据区。
      el2,用户级加密区:设备开机后,需要至少一次解锁对应用户的锁屏界面(密码、指纹、人脸等方式或无密码状态)后,才能够访问的加密数据区。
    4. 四级、五级目录:
      通过ApplicationContext可以获取distributedfiles目录或base下的filescachepreferencestemp等目录的应用文件路径,应用全局信息可以存放在这些目录下。
      通过UIAbilityContextAbilityStageContextExtensionContext可以获取HAP级别应用文件路径。

    应用文件路径 :参考官方文档即可

    样例:获取文件目录

    import common from '@ohos.app.ability.common';
    
    @Entry
    @Component
    struct Index_file_basic {
      private context = getContext(this) as common.UIAbilityContext;
    
      @Builder
      readData() {
        Text('数据读取区').margin(5)
        Column() {
          Text('安装文件路径:bundle:')
          TextInput({ text: this.context ? this.context.bundleCodeDir : "" }).backgroundColor(Color.White).width('100%')
        }.padding(5).alignItems(HorizontalAlign.Start)
    
        // Column() {
        //   // 本设备文件路径:应用在本设备存放持久化数据目录
        //   Text('base:')
        //   // 获取base通过NA属性,但是没有
        //   TextInput({ text: this.context ? this.context.NA : "" }).backgroundColor(Color.White).width('100%')
        // }.padding(5).alignItems(HorizontalAlign.Start)
    
        Column() {
          Text('数据库:database:')
          TextInput({ text: this.context ? this.context.databaseDir : "" }).backgroundColor(Color.White).width('100%')
        }.padding(5).alignItems(HorizontalAlign.Start)
    
        Column() {
          Text('分布式文件路径:distributedfiles:')
          TextInput({ text: this.context ? this.context.distributedFilesDir : "" }).backgroundColor(Color.White).width('100%')
        }.padding(5).alignItems(HorizontalAlign.Start)
    
        // 通用文件路径:图片,媒体文件,日志文件
        // 注意:获取到的是entry模块打包后的hap下的路径(7级路径),不是应用下的路径(5级路径)
        // 因为咱们得代码最终是打包到了entry的hap包下
        // /data/storage/el2/base/haps/entry/files
        Column() {
          Text('应用通用文件路径:files:')
          TextInput({ text: this.context ? this.context.filesDir : "" }).backgroundColor(Color.White).width('100%')
        }.padding(5).alignItems(HorizontalAlign.Start)
    
        //应用缓存路径
        // 注意:获取到的是entry模块打包后的hap下的路径(7级路径),不是应用下的路径(5级路径)
        // 因为咱们得代码最终是打包到了entry的hap包下
        // /data/storage/el2/base/haps/entry/cache
        Column() {
          Text('应用缓存文件路径:cache:')
          TextInput({ text: this.context ? this.context.cacheDir : "" }).backgroundColor(Color.White).width('100%')
        }.padding(5).alignItems(HorizontalAlign.Start)
    
        //Preference路径
        // 注意:获取到的是entry模块打包后的hap下的路径(7级路径),不是应用下的路径(5级路径)
        // 因为咱们得代码最终是打包到了entry的hap包下
        // /data/storage/el2/base/haps/entry/preferences
        Column() {
          Text('应用首选项文件路径	:preference:')
          TextInput({ text: this.context ? this.context.preferencesDir : "" }).backgroundColor(Color.White).width('100%')
        }.padding(5).alignItems(HorizontalAlign.Start)
    
        //temp路径
        // 注意:获取到的是entry模块打包后的hap下的路径(7级路径),不是应用下的路径(5级路径)
        // 因为咱们得代码最终是打包到了entry的hap包下
        // /data/storage/el2/base/haps/entry/temp
        Column() {
          Text('应用临时文件路径:temp:')
          TextInput({ text: this.context ? this.context.tempDir : "" }).backgroundColor(Color.White).width('100%')
        }.padding(5).alignItems(HorizontalAlign.Start)
    
      }
    
      build() {
        Column() {
          Column() {
            this.readData()
          }
          .width('100%')
          .height('100%')
          .padding(10)
          .backgroundColor(0xe0e0e0)
        }
      }
    }
    

    在这里插入图片描述

    样例:文件管理-应用文件-访问

    1. openSync , 同步打开 , 可以新建并打开一个文件
    2. writeSync,同步写
    3. readSync,同步读
    import fs, { ReadOptions } from '@ohos.file.fs';
    import common from '@ohos.app.ability.common';
    import { buffer } from '@kit.ArkTS';
    
    @Entry
    @Component
    struct Index_operate_file {
      @State content: string = ''
      @State result: string = ''
      private context = getContext(this) as common.UIAbilityContext;
    
      @Builder
      saveData() {
        Text('数据保存区').margin(5)
        Row() {
          Text('内容:')
          TextInput({ text: '', placeholder: "请输入内容" })
            .backgroundColor(Color.White)
            .width('90%')
            .onChange((value) => {
              this.content = value
            })
        }
        .padding(5)
    
        Button('写入数据')
          .fontSize(18)
          .width('50%')
          .fontWeight(FontWeight.Bold)
          .padding(8)
          .margin(10)
          .onClick(() => {
            this.saveFileContent()
          })
      }
    
      @Builder
      readData() {
        Text('数据读取区').margin(5)
        Row() {
          Text('内容:')
          TextInput({ text: this.result })
            .backgroundColor(Color.White)
            .width('90%')
        }.padding(5)
    
        Button('读取数据')
          .fontSize(18)
          .fontWeight(FontWeight.Bold)
          .width('50%')
          .padding(8)
          .margin(10)
          .onClick(() => {
            this.readFileContent()
          })
      }
    
      // 写入文件一段内容
      saveFileContent() {
        // 获取应用文件路径
        let filesDir = this.context.filesDir;
        // 新建并打开文件
        let file = fs.openSync(filesDir + '/test.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
        // 写入一段内容至文件
        let writeLen = fs.writeSync(file.fd, this.content);
        console.log("test", "The length of str is: " + writeLen)
        AlertDialog.show({ message: '写入成功' })
      }
    
      // 从文件读取一段内容
      readFileContent() {
        // 打开文件
        let filesDir = this.context.filesDir;
        let file = fs.openSync(filesDir + '/test.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
        // 读取文件
        let arrayBuffer = new ArrayBuffer(1024);
        let readOptions: ReadOptions = {
          offset: 0,
          length: arrayBuffer.byteLength
        };
        let readLen = fs.readSync(file.fd, arrayBuffer, readOptions);
        let buf = buffer.from(arrayBuffer, 0, readLen);
        console.info("the content of file: " + buf.toString());
        this.result = buf.toString()
        // 关闭文件
        fs.closeSync(file);
      }
    
      build() {
        Row() {
          Column() {
            this.saveData()
            Divider().margin(20)
            this.readData()
          }
          .width('100%')
          .height('100%')
          .padding(10)
          .backgroundColor(0xe0e0e0)
        }
      }
    }
    

    在这里插入图片描述

    样例:文件管理-应用文件-空间大小

    import storageStatistics from "@ohos.file.storageStatistics";
    import statvfs from '@ohos.file.statvfs';
    
    @Entry
    @Component
    struct Index_get_space_size {
      @State appSpace: number = 0
      @State freeSpace: number = 0
    
      @Builder
      getAppSpace() {
        Text('应用存储空间大小').margin(5)
        Row() {
          Text('大小:')
          TextInput({ text: (this.appSpace / 1024).toString() + 'KB', placeholder: "待获取" }).backgroundColor(Color.White).width('90%')
        }
        .padding(5)
    
        Button('获取')
          .fontSize(18)
          .width('50%')
          .fontWeight(FontWeight.Bold)
          .padding(8)
          .margin(10)
          .onClick(() => {
            storageStatistics.getCurrentBundleStats((err, bundleStats) => {
              console.info(`succeeded, appsize is ${bundleStats.appSize}`);
              this.appSpace = bundleStats.appSize
            });
          })
      }
    
      @Builder
      getFreeSpace() {
        Text('系统剩余空间大小').margin(5)
        Row() {
          Text('大小:')
          TextInput({ text: (this.freeSpace / 1024).toString() + 'KB', placeholder: "待获取" }).backgroundColor(Color.White).width('90%')
        }.padding(5)
    
        Button('获取')
          .fontSize(18)
          .fontWeight(FontWeight.Bold)
          .width('50%')
          .padding(8)
          .margin(10)
          .onClick(() => {
            let path = "/data";
            statvfs.getFreeSize(path, (err, number) => {
              console.info(`succeeded, size is ${number} M`);
              this.freeSpace = number
            });
          })
      }
    
      build() {
        Row() {
          Column() {
            this.getAppSpace()
            Divider().margin(20)
            this.getFreeSpace()
          }
          .width('100%')
          .height('100%')
          .padding(10)
          .backgroundColor(0xe0e0e0)
        }
      }
    }
    

    在这里插入图片描述

    样例:文件管理-用户文件-选择图片

    import picker from '@ohos.file.picker';
    import fs from '@ohos.file.fs';
    import { BusinessError } from '@kit.BasicServicesKit';
    
    @Entry
    @Component
    struct Index_select_pic {
      @State pic:string = ''
    
      build() {
        Column() {
          Text('选择喜欢的图片').margin(5)
          Row() {
            Text('图片:')
            Image(this.pic)
              .width(200)
              .height(200)
              .objectFit(ImageFit.Fill)
          }
          .padding(5)
    
          Button('选择图片')
            .fontSize(18)
            .width('50%')
            .fontWeight(FontWeight.Bold)
            .padding(8)
            .margin(10)
            .onClick(() => {
              const photoSelectOptions = new picker.PhotoSelectOptions();
              photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE
              photoSelectOptions.maxSelectNumber = 5; // 选择媒体文件的最大数目
              let URI = '';
              const photoViewPicker = new picker.PhotoViewPicker();
              photoViewPicker.select(photoSelectOptions).then((photoSelectResult) => {
                URI = photoSelectResult.photoUris[0];
                console.info('succeed and URI is:' + URI);
                //直接将uri给图片路径变量即可
                this.pic = URI
              }).catch((err:BusinessError) => {
                let error: BusinessError = err as BusinessError;
                console.error('PhotoViewPicker failed with err: ' + JSON.stringify(error));
              })
            })
        }
        .width('100%')
        .height('100%')
        .padding(10)
        .backgroundColor(0xe0e0e0)
      }
    }
    

    在这里插入图片描述

  • 相关阅读:
    FreeRTOS学习笔记-基于stm32(8)信号量总结(二值信号量、计数型信号量、互斥信号量、优先级翻转、优先级继承)
    全网最全的知识库管理工具综合评测和推荐:FlowUs、Baklib、简道云
    Debian10离线安装docker-20.10.13
    机器人力控:导纳控制性能受限于力矩传感器的动态特性
    基于SSM的学院学生论坛系统的设计与实现
    嵌入式设备视频编码比较:H.264、H.265、MPEG-2和MJPG
    伪原创-伪原创软件-免费伪原创软件
    MAX6675应用注意事项
    【语音识别入门】Python音频处理示例(含完整代码)
    WinForm实现多人聊天工具完整源码
  • 原文地址:https://blog.csdn.net/weixin_37646636/article/details/140364025