鸿蒙Next文件读写操作支持写入汉字等符号

2025-06-27 22:51:17
108次阅读
0个评论

本文介绍一下: 1.获取指定目录下的文件 2.向文件内追加写入 3.读取文件中的内容 看一下实现效果: 演示.gif 实现步骤: 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.获取到当前文件的内容,然后写入最后面的位置,应该就可以了吧? 写入乱码.png 发现,插入位置不对,插入内容多了个异常符合,这是为什么呢? 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()) 写入符合.png 写入汉字,符号,都显示正常了 核心代码

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

登录 后评论。没有帐号? 注册 一个。