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

官方文档: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)
  }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值