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

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

liebian365 2024-11-09 13:44 25 浏览 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、运行结果

相关推荐

4万多吨豪华游轮遇险 竟是因为这个原因……

(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...

“菜鸟黑客”必用兵器之“渗透测试篇二”

"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...

科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白

作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...

麦子陪你做作业(二):KEGG通路数据库的正确打开姿势

作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...

知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势

智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...

每日新闻播报(September 14)_每日新闻播报英文

AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...

香港新巴城巴开放实时到站数据 供科技界研发使用

中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...

5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper

本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...

Qt动画效果展示_qt显示图片

今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...

如何从0到1设计实现一门自己的脚本语言

作者:dong...

三年级语文上册 仿写句子 需要的直接下载打印吧

描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...

C++|那些一看就很简洁、优雅、经典的小代码段

目录0等概率随机洗牌:1大小写转换2字符串复制...

二年级上册语文必考句子仿写,家长打印,孩子照着练

二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...

一年级语文上 句子专项练习(可打印)

...

亲自上阵!C++ 大佬深度“剧透”:C++26 将如何在代码生成上对抗 Rust?

...

取消回复欢迎 发表评论: