百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

基于ArkTS语言的OpenHarmony APP应用开发:文件操作

liebian365 2024-11-09 13:44 29 浏览 0 评论

1、程序介绍

本示例主要展示了文件操作相关的功能,实现了打开文件、关闭文件、写入和读取、压缩和解压文件等功能。

本案例已在OpenHarmony凌蒙派-RK3568开发板验证通过,具体代码可参考:https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk3568-openharmony/tree/master/samples/d10_FileOperator#ui

API版本:9

2、知识准备

2.1、fs模块

该模块为基础文件操作API,提供基础文件操作能力,包括文件基本管理、文件目录管理、文件信息统计、文件流式读写等常用功能。

注意:该模块从API Version 9开始支持。

2.1.1、导入模块

import fs from '@ohos.file.fs';

2.1.2、fs.open

// 打开文件,使用Promise异步回调。支持使用URI打开文件。
open(path: string, mode?: number): Promise<File>
// 打开文件,使用callback异步回调。支持使用URI打开文件。
open(path: string, mode?: number, callback: AsyncCallback<File>): void
// 以同步方法打开文件。支持使用URI打开文件。
openSync(path: string, mode?: number): File

系统能力:SystemCapability.FileManagement.File.FileIO

其中,参数定义如下:

参数名

类型

必填

说明

path

string

文件的应用沙箱路径或文件URI

mode

number

打开文件的选项,必须指定如下选项中的一个,默认以只读方式打开: - OpenMode.READ_ONLY(0o0):只读打开。 - OpenMode.WRITE_ONLY(0o1):只写打开。 - OpenMode.READ_WRITE(0o2):读写打开。 给定如下功能选项,以按位或的方式追加,默认不给定任何额外选项: - OpenMode.CREATE(0o100):若文件不存在,则创建文件。 - OpenMode.TRUNC(0o1000):如果文件存在且以只写或读写的方式打开文件,则将其长度裁剪为零。 - OpenMode.APPEND(0o2000):以追加方式打开,后续写将追加到文件末尾。 - OpenMode.NONBLOCK(0o4000):如果path指向FIFO、块特殊文件或字符特殊文件,则本次打开及后续 IO 进行非阻塞操作。 - OpenMode.DIR(0o200000):如果path不指向目录,则出错。 - OpenMode.NOFOLLOW(0o400000):如果path指向符号链接,则出错。 - OpenMode.SYNC(0o4010000):以同步IO的方式打开文件。

其中,返回值定义如下:

类型

说明

Promise<File>

Promise对象。返回File对象。

File

打开的File对象。

2.1.3、fs.close

// 关闭文件,使用Promise异步回调。
close(file: File|number): Promise<void>
// 关闭文件,使用callback异步回调。
close(file: File|number, callback: AsyncCallback<void>): void
// 以同步方法关闭文件。
closeSync(file: File|number): void

系统能力:SystemCapability.FileManagement.File.FileIO

其中,参数定义如下:

参数名

类型

必填

说明

file

File | number

已打开的File对象或已打开的文件描述符fd。

callback

AsyncCallback<void>

异步关闭文件之后的回调。

2.1.4、fs.write

// 将数据写入文件,使用Promise异步回调。
write(fd: number, buffer: ArrayBuffer|string, options?: { offset?: number; length?: number; encoding?: string; }): Promise<number>
// 将数据写入文件,使用callback异步回调。
write(fd: number, buffer: ArrayBuffer|string, options?: { offset?: number; length?: number; encoding?: string; }, callback: AsyncCallback<number>): void
// 以同步方法将数据写入文件。
writeSync(fd: number, buffer: ArrayBuffer|string, options?: { offset?: number; length?: number; encoding?: string; }): number

系统能力:SystemCapability.FileManagement.File.FileIO

其中,参数定义如下:

参数名

类型

必填

说明

fd

number

已打开的文件描述符fd。

buffer

ArrayBuffer | string

待写入文件的数据,可来自缓冲区或字符串。

options

Object

支持如下选项: - offset,number类型,表示期望写入文件的位置。可选,默认从当前位置开始写。 - length,number类型,表示期望写入数据的长度。可选,默认缓冲区长度。 - encoding,string类型,当数据是string类型时有效,表示数据的编码方式,默认 'utf-8'。当前仅支持 'utf-8'。

callback

AsyncCallback<number>

异步将数据写入完成后执行的回调函数。

其中,返回值定义如下:

类型

说明

Promise<number>

Promise对象。返回实际写入的长度。

number

实际写入的长度

2.1.5、fs.read

// 从文件读取数据,使用Promise异步回调。
read(fd: number, buffer: ArrayBuffer, options?: { offset?: number; length?: number; }): Promise<number>
// 从文件读取数据,使用callback异步回调。
read(fd: number, buffer: ArrayBuffer, options?: { offset?: number; length?: number; }, callback: AsyncCallback<number>): void
// 以同步方法从文件读取数据。
readSync(fd: number, buffer: ArrayBuffer, options?: { offset?: number; length?: number; }): number

系统能力:SystemCapability.FileManagement.File.FileIO

其中,参数定义如下:

参数名

类型

必填

说明

fd

number

已打开的文件描述符。

buffer

ArrayBuffer

用于保存读取到的文件数据的缓冲区。

options

Object

支持如下选项: - offset,number类型,表示期望读取文件的位置。可选,默认从当前位置开始读。 - length,number类型,表示期望读取数据的长度。可选,默认缓冲区长度。

其中,返回值定义如下:

类型

说明

Promise<number>

Promise对象。返回读取的结果。

number

实际读取的长度

2.1.6、fs.close

// 关闭文件,使用Promise异步回调。
close(file: File|number): Promise<void>
// 关闭文件,使用callback异步回调。
close(file: File|number, callback: AsyncCallback<void>): void
// 以同步方法关闭文件。
closeSync(file: File|number): void

系统能力:SystemCapability.FileManagement.File.FileIO

其中,参数定义如下:

参数名

类型

必填

说明

file

File|number

已打开的File对象或已打开的文件描述符fd。

callback

AsyncCallback<void>

异步关闭文件之后的回调。

其中,返回值定义如下:

2.1.7、fs.stat

// 获取文件详细属性信息,使用Promise异步回调。
stat(file: string|number): Promise<Stat>
// 获取文件详细属性信息,使用callback异步回调。
stat(file: string|number, callback: AsyncCallback<Stat>): void
// 以同步方法获取文件详细属性信息。
statSync(file: string|number): Stat

系统能力:SystemCapability.FileManagement.File.FileIO

其中,参数定义如下:

参数名

类型

必填

说明

file

string|number

文件应用沙箱路径path或已打开的文件描述符fd。

callback

AsyncCallback<Stat>

异步获取文件的信息之后的回调。

其中,返回值定义如下:

类型

说明

Promise<Stat>

Promise对象。返回文件的具体信息。

Stat

表示文件的具体信息。

2.1.8、fs.unlink

// 删除单个文件,使用Promise异步回调。
unlink(path: string): Promise<void>
// 删除文件,使用callback异步回调。
unlink(path: string, callback: AsyncCallback<void>): void
// 以同步方法删除文件。
unlinkSync(path: string): void

系统能力:SystemCapability.FileManagement.File.FileIO

其中,参数定义如下:

参数名

类型

必填

说明

path

string

文件的应用沙箱路径。

callback

AsyncCallback<void>

异步删除文件之后的回调。

2.2、zlib模块

本模块提供压缩解压缩文件的能力。

本模块首批接口从API version 7开始支持。

2.2.1、导入模块

import zlib from '@ohos.zlib';

2.2.2、zlib.zipFile

// 压缩接口(Promise形式)。
zipFile(inFile: string, outFile: string, options: Options): Promise<void>

系统能力: SystemCapability.BundleManager.Zlib

其中,参数定义如下:

参数名

类型

必填

说明

inFile

string

指定压缩的文件夹路径或者文件路径,路径必须为沙箱路径,沙箱路径可以通过context获取。

outFile

string

指定压缩结果的文件路径(文件的扩展名zip)。

options

Options

压缩的可选参数。

其中,返回值定义如下:

类型

说明

Promise<void>

ERROR_CODE_OK:压缩成功; ERROR_CODE_ERRNO:压缩失败。

2.2.3、zlib.unzipFile

// 解压文件,解压完成返回执行结果(Promise形式)。
unzipFile(inFile:string, outFile:string, options: Options): Promise<void>

系统能力: SystemCapability.BundleManager.Zlib

其中,参数定义如下:

参数名

类型

必填

说明

inFile

string

指定的待解压缩文件的文件路径,路径必须为沙箱路径,沙箱路径可以通过context获取。

outFile

string

指定的解压文件路径。

options

Options

解压的可选参数。

其中,返回值定义如下:

类型

说明

Promise<void>

ERROR_CODE_OK:解压成功; ERROR_CODE_ERRNO:解压失败返回执行结果。

3、程序解析

3.1、获取APP文件存储路径

使用getContext().filesDir获取APP文件存储路径,使用getContext().cacheDir获取缓存存储路径。具体代码如下:

Button('获取根目录')
  .onClick(() => {
    // 获取APP应用程序的根目录
    this.rootDir = getContext().filesDir
    // getContext().filesDir获取文件存储路径
    console.log("files dir: " + getContext().filesDir)
    // getContext().cacheDir获取缓存存储路径
    console.log("cache dir: " + getContext().cacheDir)
  })

3.2、文件操作

通过调用fs模块的相应接口对文件进行读写操作。具体代码如下所示:

  private close(path: string) {
    // 文件绝对路径
    let filePath = path + "/" + this.fileName;
    // 打开文件
    let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
    console.log("close file result: " + file.fd);
    // 关闭文件
    fs.closeSync(file);
  }

  private open(path: string) {
    let filePath = path + "/" + this.fileName;
    let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
    console.log("open file result: " + file.fd);
    fs.closeSync(file);
  }

  private read(path: string) {
    let filePath = path + "/" + this.fileName;
    let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
    let buffer = new ArrayBuffer(4096);
    // 读取文件内容
    let number = fs.readSync(file.fd, buffer);
    console.log("read success, read length: " + number);
    fs.closeSync(file);
  }

  private write(path: string) {
    let filePath = path + "/" + this.fileName;
    let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
    // 往文件中写入
    let writeLen = fs.writeSync(file.fd, "Hello OpenHarmony");
    console.log("write success, write length: " + writeLen);
    fs.closeSync(file);
  }

  private stat(path: string) {
    let filePath = path + "/" + this.fileName;
    let stat = fs.statSync(filePath);
    console.info("" + filePath + " get file info success, the size of file is " + stat.size);
  }

  private unlink(path: string) {
    let filePath = path + "/" + this.fileName;
    // 删除文件
    fs.unlinkSync(filePath);
    console.log("unlinkSync success");
  }

3.3、压缩解压操作

通过zlib模块对文件进行压缩解压操作。具体代码如下所示:

private unzip(path: string) {
  let inFile = path + "/test.zip";
  let outFile = path;
  // 解压压缩文件
  zlib.unzipFile(inFile, outFile, {})
    .then((result) => {
      console.log(JSON.stringify(result));
    })
    .catch((error) => {
      console.log(JSON.stringify(error));
    })
}

private zip(path: string) {
  let inFile = path + "/" + this.fileName;
  let outFile = path + "/test.zip";
  // 压缩文件
  zlib.zipFile(inFile, outFile, {})
    .then((result) => {
      console.log(JSON.stringify(result));
    })
    .catch((error) => {
      console.log(JSON.stringify(error));
    })
}

4、项目编译

4.1、打开项目

打开DevEco Studio,再打开自定义通知项目。

4.2、编译程序

点击菜单栏上的“Build” -> "Rebuild Project"。如果出现无法编译,则注意查看Event Log界面。如下所示:

点击Run 'npm install',让DevEco Studio安装相关依赖包。

重新点击菜单栏上的“Build” -> "Rebuild Project"。出现如下错误:

点击上图红色框部分,安装相关服务。

重新点击菜单栏上的“Build” -> "Rebuild Project",编译成功。

4.3、安装程序

点击“entry”按钮,将项目程序安装到设备端。如下图所示:

如果出现下述报错,表示无法安装。如图所示:

点击上图红色框的蓝色字体,弹出"Project Structure"对话框,点击"Apply",再点击"OK"。如图所示:

重新点击“entry”按钮,将项目程序安装到设备端。

5、运行结果

相关推荐

go语言也可以做gui,go-fltk让你做出c++级别的桌面应用

大家都知道go语言生态并没有什么好的gui开发框架,“能用”的一个手就能数的清,好用的就更是少之又少。今天为大家推荐一个go的gui库go-fltk。它是通过cgo调用了c++的fltk库,性能非常高...

旧电脑的首选系统:TinyCore!体积小+精简+速度极快,你敢安装吗

这几天老毛桃整理了几个微型Linux发行版,准备分享给大家。要知道可供我们日常使用的Linux发行版有很多,但其中的一些发行版经常会被大家忽视。其实这些微型Linux发行版是一种非常强大的创新:在一台...

codeblocks和VS2019下的fltk使用中文

在fltk中用中文有点问题。英文是这样。中文就成这个样子了。我查了查资料,说用UTF-8编码就行了。edit->Fileencoding->UTF-8然后保存文件。看下下边的编码指示确...

FLTK(Fast Light Toolkit)一个轻量级的跨平台Python GUI库

FLTK(FastLightToolkit)是一个轻量级的跨平台GUI库,特别适用于开发需要快速、高效且简单界面的应用程序。本文将介绍Python中的FLTK库,包括其特性、应用场景以及如何通过代...

中科院开源 RISC-V 处理器“香山”流片,已成功运行 Linux

IT之家1月29日消息,去年6月份,中科院大学教授、中科院计算所研究员包云岗,发布了开源高性能RISC-V处理器核心——香山。近日,包云岗在社交平台晒出图片,香山芯片已流片,回片后...

Linux 5.13内核有望合并对苹果M1处理器支持的初步代码

预计Linux5.13将初步支持苹果SiliconM1处理器,不过完整的支持工作可能还需要几年时间才能完全完成。虽然Linux已经可以在苹果SiliconM1上运行,但这需要通过一系列的补丁才能...

Ubuntu系统下COM口测试教程(ubuntu port)

1、在待测试的板上下载minicom,下载minicom有两种方法:方法一:在Ubuntu软件中心里面搜索下载方法二:按“Ctrl+Alt+T”打开终端,打开终端后输入“sudosu”回车;在下...

湖北嵌入式软件工程师培训怎么选,让自己脱颖而出

很多年轻人毕业即失业、面试总是不如意、薪酬不满意、在家躺平。“就业难”该如何应对,参加培训是否能改变自己的职业走向,在湖北,有哪些嵌入式软件工程师培训怎么选值得推荐?粤嵌科技在嵌入式培训领域有十几年经...

新阁上位机开发---10年工程师的Modbus总结

前言我算了一下,今年是我跟Modbus相识的第10年,从最开始的简单应用到协议了解,从协议开发到协议讲解,这个陪伴了10年的协议,它一直没变,变的只是我对它的理解和认识。我一直认为Modbus协议的存...

创建你的第一个可运行的嵌入式Linux系统-5

@ZHangZMo在MicrochipBuildroot中配置QT5选择Graphic配置文件增加QT5的配置修改根文件系统支持QT5修改output/target/etc/profile配置文件...

如何在Linux下给zigbee CC2530实现上位机

0、前言网友提问如下:粉丝提问项目框架汇总下这个网友的问题,其实就是实现一个网关程序,内容分为几块:下位机,通过串口与上位机相连;下位机要能够接收上位机下发的命令,并解析这些命令;下位机能够根据这些命...

Python实现串口助手 - 03串口功能实现

 串口调试助手是最核心的当然是串口数据收发与显示的功能,pzh-py-com借助的是pySerial库实现串口收发功能,今天痞子衡为大家介绍pySerial是如何在pzh-py-com发挥功能的。一、...

为什么选择UART(串口)作为调试接口,而不是I2C、SPI等其他接口

UART(通用异步收发传输器)通常被选作调试接口有以下几个原因:简单性:协议简单:UART的协议非常简单,只需设置波特率、数据位、停止位和校验位就可以进行通信。相比之下,I2C和SPI需要处理更多的通...

同一个类,不同代码,Qt 串口类QSerialPort 与各种外设通讯处理

串口通讯在各种外设通讯中是常见接口,因为各种嵌入式CPU中串口标配,工业控制中如果不够还通过各种串口芯片进行扩展。比如spi接口的W25Q128FV.对于软件而言,因为驱动接口固定,软件也相对好写,因...

嵌入式linux为什么可以通过PC上的串口去执行命令?

1、uboot(负责初始化基本硬bai件,如串口,网卡,usb口等,然du后引导系统zhi运行)2、linux系统(真正的操作系统)3、你的应用程序(基于操作系统的软件应用)当你开发板上电时,u...

取消回复欢迎 发表评论: