鸿蒙Next文件读写操作支持写入汉字等符号
2025-06-27 22:51:17
108次阅读
0个评论
本文介绍一下: 1.获取指定目录下的文件 2.向文件内追加写入 3.读取文件中的内容 看一下实现效果: 实现步骤: 1.使用fileIo.writeSync(fd: number, buffer: ArrayBuffer | string, options?: WriteOptions)写入到文件中
// 文件不存在时创建并打开文件,文件存在时打开文件
let file = fileIo.openSync(filesDir + fileName, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
// 写入一段内容至文件
let writeLen = fileIo.writeSync(file.fd, str);
fileIo.closeSync(file);
这种写法,每次都是从文件的开头写入,会覆盖之前的内容,肯定不是我们要实现的效果,因此可以设置WriteOptions,可以设置偏移量,从文件末尾写入 2.以同步方法基于文本方式读取文件(即直接读取文件的文本内容)readTextSync(filePath: string, options?: ReadTextOptions)
function readFileSync(): string {
let content = ''
let readTextOptions: ReadTextOptions = {
encoding: 'utf-8'
};
try {
content = fileIo.readTextSync(filesDir + fileName,readTextOptions)
}catch (e) {
}
return content;
}
3.获取到当前文件的内容,然后写入最后面的位置,应该就可以了吧? 发现,插入位置不对,插入内容多了个异常符合,这是为什么呢? 4.尝试了多次,发现只有汉字会出现这种情况,那肯定是计算文件长度的时候出了问题,1个汉字的长度是1,但是UTF-8编码时大部分是3,所以需要在计算长度时做个转码
//string转Uint8Array
function stringToUint8Array(str: string): Uint8Array {
if (isEmpty(str)){
return new Uint8Array()
}
try {
let textEncoder = new util.TextEncoder("utf-8");
let array: Uint8Array = textEncoder.encodeInto(str);
return array
} catch (err) {
return new Uint8Array()
}
}
5.修改offset:stringToUint8Array(readFileSync()) 写入汉字,符号,都显示正常了 核心代码:
function writeFile(str:string): void {
// 文件不存在时创建并打开文件,文件存在时打开文件
let file = fileIo.openSync(filesDir + fileName, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
// 写入一段内容至文件
let writeLen = fileIo.writeSync(file.fd, str,{offset:stringToUint8Array(readFileSync()).length});
fileIo.closeSync(file);
}
function readFileSync(): string {
let content = ''
let readTextOptions: ReadTextOptions = {
encoding: 'utf-8'
};
try {
//如果文件内容为空会报错,因此加个catch
content = fileIo.readTextSync(filesDir + fileName,readTextOptions)
}catch (e) {
}
return content;
}
function deleteFile(): void {
let filePath =filesDir + fileName;
try {
//如果文件不存在 会报错
fileIo.unlinkSync(filePath);
}catch (e) {
//No such file or directory
}
}
// 获取应用文件路径
let context = getContext(this) as common.UIAbilityContext;
let filesDir = context.filesDir;
let fileName = '/'+new Date().getFullYear()+'_'+(new Date().getMonth()+1)+'_'+new Date().getDate()+'_'+new Date().getHours()+'.txt'
// 查看文件列表
function getListFile(): string[] {
let listFileOption: ListFileOptions = {
recursion: false, //是否递归子目录下文件名
listNum: 0, //当设置0时,列出所有文件
filter: {
suffix: [".png", ".jpg", ".txt"], //文件后缀名完全匹配
displayName: ["*"], //文件名模糊匹配
fileSizeOver: 0, //文件大小匹配,大于指定大小的文件
lastModifiedAfter: new Date(0).getTime() //文件最近修改时间匹配
}
};
//以同步方式列出当前目录下所有文件名和目录名
let files = fileIo.listFileSync(filesDir, listFileOption);
return files
}
读文件还有其他的方式,例如按行读:readLinesSync(filePath: string, options?: Options): ReaderIterator 以同步方式逐行读取文件的文本内容
function readFile(): string {
let content = ''
let file = fileIo.openSync(filesDir + fileName, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
let options: Options = {
encoding: 'utf-8'
};
//逐行读取文件文本内容
let readerIterator = fileIo.readLinesSync(filesDir + fileName, options);
try {
//如果文件内容为空,会报错
for (let it = readerIterator.next(); !it.done; it = readerIterator.next()) {
content+=it.value
}
fileIo.closeSync(file);
}catch (e) {
fileIo.closeSync(file);
}
return content;
}
总结: 1.需要注意写入位置,汉字的长度计算 2.读取空文件,活删除不存在的文件时需要catch
00
- 0回答
- 0粉丝
- 0关注
相关话题
- 数据写入文件
- 第二三课:HarmonyOS Next文件操作开发指南:读写与管理实战
- 第二三课:HarmonyOS Next文件操作开发指南:读写与管理实战
- 文件系统缓存数据写入磁盘
- 鸿蒙开发:hvigor插件中的文件操作
- 滴滴开源跨端小程序框架星河(Dimina),基于 Vue 3,支持鸿蒙等多平台
- 鸿蒙开发:异步并发操作
- HarmonyOS NEXT:模块化项目 ——修改应用图标+启动页等
- uni-app x 支持鸿蒙
- Flutter-鸿蒙化 flutter运行在鸿蒙next上操作文档
- 鸿蒙Next应用桌面快捷操作shortcuts和Form卡片介绍
- 鸿蒙未来憧憬与当下行动支持
- 鸿蒙NEXT支持设备型号汇总(API16及以上)【建议收藏】
- 鸿蒙Flutter实战:09-现有Flutter项目支持鸿蒙
- 鸿蒙封装日志库并支持跳转显示行号