HarmonyOS鸿蒙系统上File文件常用操作

HarmonyOS鸿蒙系统上,file文件常用操作记录

1.创建文件
 createFile(fileName: string, content: string): string {
    // 获取应用文件路径
    let context = getContext(this) as common.UIAbilityContext;
    let filesDirPath = context.filesDir + '/' + fileName;
    // 新建并打开文件
    let file = fs.openSync(filesDirPath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
    // 写入一段内容至文件
    let writeLen = fs.writeSync(file.fd, content);
    // 从文件读取一段内容
    let buf = new ArrayBuffer(1024);
    let readLen = fs.readSync(file.fd, buf, { offset: 0 });
    // 关闭文件
    fs.closeSync(file);
    return filesDirPath
  }
2.将沙箱文件移动到分布式文件夹
 /**
   * 创建分布式文件
   */
  async createDistributedFile(uri: string) {
    // 获取应用文件路径
    let context = getContext(this) as common.UIAbilityContext;
    let filesDir = context.distributedFilesDir;
    let fileName = this.getFileName(uri)

    try {
      let destUriPath = filesDir + '/' + fileName
      this.tempFilePath = fileName
      //给新建的文件写入内容
      // mMediaFileUtils.writeFileContent(destUriPath,content)
      // 新建并打开文件
      let writeFile = fs.openSync(destUriPath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
      //设置文件权限
      securityLabel.setSecurityLabel(destUriPath, 's1').then(() => {
      })

      // fs.write(file.fd,content)

      //读取原文件内容

      // 读取图片为buffer
      const file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
      let photoSize = fs.statSync(file.fd).size;
      let buffer = new ArrayBuffer(photoSize);
      fs.readSync(file.fd, buffer);
      fs.closeSync(file);

      //开始写入内容
      let writeLen = fs.write(writeFile.fd, buffer)
    } catch (error) {
    }
  }
3.读取分布式文件
  /**
   * 读取分布式文件
   * @param filePath
   */
  readDistributedFile(filePath: string) {
    let context = getContext(this) as common.UIAbilityContext;
    let distributedFilesDir = context.distributedFilesDir;
    let distributedFilesDirs = fs.listFileSync(distributedFilesDir);
    for (let i = 0; i < distributedFilesDirs.length; i++) {
      let fileName = distributedFilesDir + '/' + distributedFilesDirs[i]
      this.readFile(fileName)
    }

  }
4.读取文件内容
  /**
   * 读取文件
   * @param filePath 文件路径
   */
  readFile(filePath: string) {
    try {
      // 打开分布式目录下的文件
      let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE);
      // 定义接收读取数据的缓存
      let arrayBuffer = new ArrayBuffer(4096);

      // 读取文件的内容,返回值是读取到的字节个数
      class Option {
        public offset: number = 0;
        public length: number = 0;
      }

      let option = new Option();
      option.length = arrayBuffer.byteLength;
      let num = fs.readSync(file.fd, arrayBuffer, option);
      // 打印读取到的文件数据
      let buf = buffer.from(arrayBuffer, 0, num);
      Log.info('读取的文件内容: ' + buf.toString());
    } catch (error) {
      let err: BusinessError = error as BusinessError;
      Log.error(`Failed to openSync / readSync. Code: ${err.code}, message: ${err.message}`);
    }
  }

5.产看文件列表(沙箱和分布式文件夹)
  /**
   * 查看文件列表 沙箱文件夹 和 分布式文件夹
   */
  lookFilesList(): string {
  	//沙箱文件夹
    let allFiles = ''
    let context = getContext(this) as common.UIAbilityContext;
    let filesDir = context.filesDir;
    let files = fs.listFileSync(filesDir);
    for (let i = 0; i < files.length; i++) {
      Log.info(`当前设备文件 name: ${files[i]}`);
    }
	//分布式文件夹
    let distributedFilesDir = context.distributedFilesDir;
    Log.info('context.distributedFilesDir: ' + distributedFilesDir)
    let distributedFilesDirs = fs.listFileSync(distributedFilesDir);
    if (distributedFilesDirs.length > 0) {
      for (let i = 0; i < distributedFilesDirs.length; i++) {
        Log.info(`分布式文件 name: ${distributedFilesDirs[i]}`);
      }
    }

    return allFiles;
  }
6.删除分布式下指定文件
  /**
   * 删除分布式指定文件
   */
  deleteDistributedFile(fileName: string) {
    let context = getContext(this) as common.UIAbilityContext;
    let filePath = context.distributedFilesDir + '/' + fileName
    securityLabel.setSecurityLabel(filePath, 's1').then(() => {
      Log.info('Succeeded in setSecurityLabeling.');
    })

    try {
      fs.rmdir(filePath)
      Log.info('刪除文件成功')
    } catch (error) {
      let err: BusinessError = error as BusinessError;
      Log.error(`Failed to openSync / readSync. Code: ${err.code}, message: ${err.message}`);
    }

  }

7. 删除本地文件
  /**
   * 删除本地文件
   */
  deleteCurrentDeviceFile() {
    let context = getContext(this) as common.UIAbilityContext;
    let filesDir = context.filesDir;
    let filesDirs = fs.listFileSync(filesDir);

    if (filesDirs.length <= 0) {
      return
    }
    let fileName = filesDirs + '/' + filesDirs[0]
    securityLabel.setSecurityLabel(fileName, 's1').then(() => {
      Log.info('Succeeded in setSecurityLabeling.');
    })

    try {
      fs.rmdir(fileName)
      Log.info('刪除文件成功')

    } catch (error) {
      let err: BusinessError = error as BusinessError;
      Log.error(`Failed to openSync / readSync. Code: ${err.code}, message: ${err.message}`);
    }

  }
8.获取文件名
  /**
   * 获取文件名
   * @param filePath
   * @returns
   */
  getFileName(filePath: string): string {
    const parts = filePath.split('/');
    if (parts.length === 0) {
      return '';
    } // 如果没有找到任何斜杠,返回null

    const fileNameWithExtension = parts[parts.length - 1];
    const fileNameParts = fileNameWithExtension.split('.');
    if (fileNameParts.length < 2) {
      return fileNameWithExtension;
    } // 如果没有扩展名,直接返回文件名

    // return fileNameParts[0]; // 返回文件名(不含扩展名)
    return fileNameWithExtension; // 返回文件名,含扩展名
  }
9.保存文件到本地文件夹
 /**
   * 拉起picker保存文件
   */
  async saveFile(fileName: string):Promise<string>{
    let saveFileUri = ''
    try {
      let DocumentSaveOptions = new picker.DocumentSaveOptions();
      DocumentSaveOptions.newFileNames = [fileName];
      let documentPicker = new picker.DocumentViewPicker();
      await documentPicker.save(DocumentSaveOptions).then( (DocumentSaveResult) => {
        if (DocumentSaveResult !== null && DocumentSaveResult !== undefined) {
          let uri = DocumentSaveResult[0] as string;
          this.realFileUri = uri
           this.realSaveFile(fileName)
          saveFileUri = uri
        }
      }).catch((err: BusinessError) => {
        Log.error('saveFile-DocumentViewPicker.save failed with err: ' + JSON.stringify(err));
      });
    } catch (err) {
      Log.error('saveFile-DocumentViewPicker failed with err: ' + err);
    }

    return saveFileUri
  }

  realFileUri: string = ''

  /**
   * 真正开始保存文件
   */
  async realSaveFile(fileName: string) {
    let context = getContext(this) as common.UIAbilityContext;
    let pathDir = context.distributedFilesDir;
    // 获取分布式目录的文件路径
    let filePath = pathDir + '/' + fileName;
    // 读取buffer
    const file = fs.openSync(filePath, fs.OpenMode.READ_ONLY);
    let photoSize = fs.statSync(file.fd).size;
    let buffer = new ArrayBuffer(photoSize);
    fs.readSync(file.fd, buffer);
    fs.closeSync(file);
    let saveFile = fs.openSync(this.realFileUri, fs.OpenMode.WRITE_ONLY);
    let writeLen = fs.write(saveFile.fd, buffer)
    Log.info(`save file uri success ~~~~~` + writeLen);
    //保存成功以后删除分布式上面的文件
    this.deleteDistributedFile(filePath)
  }

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/919641.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【SpringMVC - 1】基本介绍+快速入门+图文解析SpringMVC执行流程

目录 1.Spring MVC的基本介绍 2.大致分析SpringMVC工作流程 3.SpringMVC的快速入门 首先大家先自行配置一个Tomcat 文件的配置 配置 WEB-INF/web.xml 创建web/login.jsp 创建com.ygd.web.UserServlet控制类 创建src下的applicationContext.xml文件 重点的注意事项和说明…

DTH11传感器温度湿度+esp8266+阿里云+小程序

arduino在之前灯的基础上再添加两个库 Adafruit_Sensor&#xff0c;#include “DHT.h” 代码如下 #include <ESP8266WiFi.h> // 引入Arduino ESP8266核心库 #include <ArduinoJson.h> // 引入JSON处理库 #include <Ticker.h> // 引入定时库 #inclu…

【汇编语言】转移指令的原理(三) —— 汇编跳转指南:jcxz、loop与位移的深度解读

文章目录 前言1. jcxz 指令1.1 什么是jcxz指令1.2 如何操作 2. loop 指令2.1 什么是loop指令2.2 如何操作 3. 根据位移进行转移的意义3.1 为什么&#xff1f;3.2 举例说明 4. 编译器对转移位移超界的检测结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构…

mac安装appuim

要在macOS上安装Appium&#xff0c;这是一个自动化测试框架&#xff0c;可以用来对移动应用进行测试&#xff08;支持iOS和Android应用&#xff09;。为了安装Appium和其依赖的环境&#xff0c;你需要做一些准备工作。以下是详细的安装步骤&#xff1a; 前提条件 1、macOS系统…

【WSL+Kali】进行系统升级时在 Setting up libc6:amd64 (2.37-15) ... 卡住不动

问题描述 当尝试执行以下命令进行系统升级时&#xff1a; sudo apt upgrade升级进程在以下步骤中卡住不动&#xff1a; Setting up libc6:amd64 (2.37-15) ...重启系统后&#xff0c;该问题仍然存在&#xff0c;如下图所示&#xff1a; 原因分析 apt命令是一个用于处理包的…

DevOps工程技术价值流:加速业务价值流的落地实践与深度赋能

DevOps的兴起&#xff0c;得益于敏捷软件开发的普及与IT基础设施代码化管理的革新。敏捷宣言虽已解决了研发流程中的诸多挑战&#xff0c;但代码开发仅是漫长价值链的一环&#xff0c;开发前后的诸多问题仍亟待解决。与此同时&#xff0c;虚拟化和云计算技术的飞跃&#xff0c;…

微深节能 平板小车运动监测与控制系统 格雷母线

微深节能的平板小车运动监测与控制系统中的格雷母线&#xff0c;是一种高精度、非接触式的位移测量系统&#xff0c;在平板小车的运动监测与控制中发挥着核心作用。 一、系统组成 该系统主要由以下关键部件组成&#xff1a; 地面电气柜&#xff1a;包含地址jie码器等重要组件&a…

【Linux课程学习】:对操作系统(Operator System)的理解

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 操作系统&#xff08;Operator system&#xf…

使用Cursor和Claude AI打造你的第一个App

大家好&#xff0c;使用Cursor和Claude AI打造应用程序是一个结合智能代码辅助和人工智能对话的创新过程。Cursor是一个编程辅助工具&#xff0c;它通过智能代码补全、聊天式AI对话和代码生成等功能&#xff0c;帮助开发者提高编程效率。Claude AI则是一个强大的人工智能平台&a…

创建springboot+vue项目相关配置问题

安装并配置jdk23 在官网下载jdk Java Downloads | Oracle 中国 下载完成后双击即可安装。 安装完成后配置环境变量 此电脑->右键->属性->高级系统设置 然后一直点击确定即可。 键盘上win r java -version 可以验证是否配置成功 下载并配置maven 在官网下…

React 中使用 Axios 进行 HTTP 请求

下面是一个案例&#xff0c;展示如何在 React 中使用 Axios 进行 HTTP 请求&#xff0c;包括 GET 和 POST 请求的使用。 1. 安装 Axios 确保项目中已安装 Axios&#xff0c;可以通过以下命令安装&#xff1a; npm install axios2. 创建一个简单的 React 应用 项目结构&…

Wekan看板安装部署与使用介绍

Wekan看板安装部署与使用介绍 1. Wekan简介 ​ Wekan 是一个开源的看板式项目管理工具&#xff0c;它的配置相对简单&#xff0c;因为大多数功能都是开箱即用的。它允许用户以卡片的形式组织和跟踪任务&#xff0c;非常适合敏捷开发和日常任务管理。Wekan 的核心功能包括看板…

推荐几个 VSCode 流程图工具

Visual Studio Code&#xff08;简称VSCode&#xff09;是一个由微软开发的免费、开源的代码编辑器。 VSCode 发布于 2015 年&#xff0c;而且很快就成为开发者社区中广受欢迎的开发工具。 VSCode 可用于 Windows、macOS 和 Linux 等操作系统。 VSCode 拥有一个庞大的扩展市…

OpenHands:开源AI编程工具的新贵,让编程更自然

&#x1f680; AI技术在编程领域的应用正迅速发展&#xff0c;其中OpenHands作为一款新兴的开源AI编程工具&#xff0c;以其出色的性能和自然语言编程体验&#xff0c;成为了开发者的新宠。今天&#xff0c;让我们一起探索OpenHands的核心功能、架构设计&#xff0c;以及如何通…

C++:探索AVL树旋转的奥秘

文章目录 前言 AVL树为什么要旋转&#xff1f;一、插入一个值的大概过程1. 插入一个值的大致过程2. 平衡因子更新原则3. 旋转处理的目的 二、左单旋1. 左单旋旋转方式总处理图2. 左单旋具体会遇到的情况3. 左单旋代码总结 三、右单旋1. 右单旋旋转方式总处理图2. 右单旋具体会遇…

嵌入式硬件实战基础篇(三)-四层板PCB设计-步进电机驱动(TMC2208/TMC2209)

引言&#xff1a;我们在嵌入式硬件杂谈&#xff08;三&#xff09;中有提到阻抗匹配的问题&#xff0c;也引入了高速PCB设计的思想&#xff0c;并且此篇实战基础篇主要是基础的四层板的绘制设计&#xff0c;后续实战会对高速板展开&#xff0c;本篇主要是提升读者的设计PCB板的…

数据库基础(MySQL)

1. 数据库基础 1.1 什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 文件保存数据有以下几个缺点&#xff1a; 文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便 数据库存储介质&#xff1a; 磁盘内存 为…

【C++】踏上C++学习之旅(九):深入“类和对象“世界,掌握编程的黄金法则(四)(包含四大默认成员函数的练习以及const对象)

文章目录 前言1. 实现Date类的构造函数2. 实现Date类的拷贝构造函数3. 实现Date类的赋值运算符重载4. 实现各Date对象之间的比较接口5. 实现Date对象的加减接口6. const成员7. 取地址及const取地址操作符重载 前言 在我们前面学习到了"类和对象"的四大默认成员函数(…

如何在 Elasticsearch 中配置 SSL / TLS ?

Elasticsearch 是一种流行的开源搜索和分析引擎。它被广泛用于日志或活动数据分析&#xff0c;全文搜索和复杂查询。但是&#xff0c;没有适当的安全措施&#xff0c;敏感数据可能很容易受到影响拦截和未经授权的访问。在 Elasticsearch 中启用 SSL/TLS 是保护数据的关键步骤。…

python之sklearn--鸢尾花数据集之数据降维(PCA主成分分析)

python之sklearn–鸢尾花数据集之数据降维(PCA主成分分析) sklearn库&#xff1a;Scikit - learn&#xff08;sklearn&#xff09;是一个用于机器学习的开源 Python 库。它建立在 NumPy、SciPy 和 matplotlib 等其他科学计算库之上&#xff0c;为机器学习的常见任务提供了简单…