文章目录前言listFile遍历目录下的文件truncate截断文件内容mkdtemp创建临时目录dup复制文件描述符utimes修改文件访问时间Stream 流操作什么时候用流什么时候直接 readText写在最后前言近期发现一款很有意思的HarmonyOS 三方库, 地址 pura/harmony-utils(V1.4.0) , 作者是桃花镇童长老, 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦案例demo导航展示↓↓↓↓↓↓接下来言归正传 ↓↓↓↓前面三篇把路径、读写、增删改都讲完了。这篇补充一些使用频率相对低但在特定场景下非常有用的高级 API目录遍历、流操作、临时目录、文件截断等。listFile遍历目录下的文件在做文件管理功能时经常需要列出某个目录下有哪些文件。非递归遍历只列当前目录constdirFileUtil.getFilesDirPath();constfilesawaitFileUtil.listFile(dir,{recursion:false});this.addLog(listFile: [${files.join(, )}]);第二个参数是选项对象recursion: false表示只列当前层不深入子目录。递归遍历包含所有子目录文件constdirFileUtil.getFilesDirPath();constfilesFileUtil.listFileSync(dir,{recursion:true});this.addLog(listFileSync(递归):${files.length}个文件);listFileSync是同步版recursion: true会递归遍历所有子目录返回所有文件名不含目录名的数组。注意返回的是文件名不是完整路径。如果要完整路径需要自己拼接constdirFileUtil.getFilesDirPath();constfilesFileUtil.listFileSync(dir,{recursion:false});constfullPathsfiles.map(name${dir}/${name});truncate截断文件内容truncate可以把文件内容截断到指定长度多余的部分直接丢掉constpFileUtil.getFilesDirPath(undefined,demo_file.txt);awaitFileUtil.truncate(p,5);this.addLog(truncate 成功保留前5字节);第二个参数是保留的字节数。上面的例子只保留文件前 5 个字节其余全部丢弃。这个 API 在什么场景用比如限制日志文件不超过某个大小时定期截断清空文件truncate(path, 0)相当于清空注意是字节数不是字符数中文字符在 UTF-8 里占 3 字节截断时要计算好。mkdtemp创建临时目录mkdtemp根据模板创建一个唯一名称的临时目录// 异步版constprefixFileUtil.getFilesDirPath()/tmp_XXXXXX;constdirawaitFileUtil.mkdtemp(prefix);this.addLog(mkdtemp: dir);// 结果类似/data/.../files/tmp_a1b2c3// 同步版constprefixFileUtil.getFilesDirPath()/stmp_XXXXXX;constdirFileUtil.mkdtempSync(prefix);this.addLog(mkdtempSync: dir);路径末尾的XXXXXX是占位符系统会用随机字符替换它保证每次创建的目录名称唯一。适合需要独立工作目录的场景下载文件时用临时目录暂存处理完再rename到正式位置失败了整个临时目录rmdir就干净了。dup复制文件描述符dup是底层操作用于复制一个文件描述符fdconstpFileUtil.getFilesDirPath(undefined,fd_demo.txt);constfFileUtil.openSync(p,fs.OpenMode.READ_WRITE|fs.OpenMode.CREATE);constdupFileFileUtil.dup(f.fd);this.addLog(dup fd: dupFile.fd);FileUtil.closeSync(f);FileUtil.closeSync(dupFile);dup返回一个新的fs.File对象它和原来的 fd 指向同一个文件但是独立的文件描述符。使用场景把同一个文件同时交给不同模块操作每个模块有自己的 fd互不干扰。用完记得两个都关闭。utimes修改文件访问时间constpFileUtil.getFilesDirPath(undefined,fd_demo.txt);FileUtil.utimes(p,Date.now());this.addLog(utimes 更新成功);utimes更新文件的最后访问时间戳atime。Date.now()返回的是毫秒级时间戳直接传就行。这个 API 的实际用途防止缓存文件被系统认为长时间未访问而被清理按时间排序文件列表时手动更新 atimeStream 流操作流操作适合大文件场景避免一次性把整个文件读入内存。createStream异步创建流constpFileUtil.getFilesDirPath(undefined,stream_demo.txt);// 先确保文件存在awaitFileUtil.writeEasy(p,stream test\n,false);// 以 r读写模式打开流conststreamawaitFileUtil.createStream(p,r);this.addLog(createStream 成功: typeofstream);awaitstream.close();模式字符串和 C 语言的 fopen 一致r只读w只写清空a追加r读写w读写清空createStreamSync同步创建流constpFileUtil.getFilesDirPath(undefined,stream_demo.txt);conststreamFileUtil.createStreamSync(p,r);this.addLog(createStreamSync 成功: typeofstream);stream.closeSync();流用完必须关闭异步流用await stream.close()同步流用stream.closeSync()。什么时候用流什么时候直接 readText场景推荐方式文件 1MB内容是文本readText/readTextSync文件 1MB或者是二进制Stream 流需要分块读取、边读边处理Stream 流简单追加写入writeEasy需要随机读写跳到某个偏移位置fd 方式写在最后这篇的 API 用到的频率不算高但遇到特定需求时它们是最合适的工具listFile目录遍历recursion控制是否递归truncate截断文件日志限制大小时很有用mkdtemp创建唯一临时目录处理临时文件的好帮手Stream 流大文件操作的正确姿势四篇 FileUtil 文章到这里就完整了从路径到读写到管理到高级操作应该能覆盖日常 90% 以上的文件操作需求了。
HarmonyOS 文件列表与流操作:listFile、Stream 及高级 API 实战
发布时间:2026/5/29 3:29:38
文章目录前言listFile遍历目录下的文件truncate截断文件内容mkdtemp创建临时目录dup复制文件描述符utimes修改文件访问时间Stream 流操作什么时候用流什么时候直接 readText写在最后前言近期发现一款很有意思的HarmonyOS 三方库, 地址 pura/harmony-utils(V1.4.0) , 作者是桃花镇童长老, 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦案例demo导航展示↓↓↓↓↓↓接下来言归正传 ↓↓↓↓前面三篇把路径、读写、增删改都讲完了。这篇补充一些使用频率相对低但在特定场景下非常有用的高级 API目录遍历、流操作、临时目录、文件截断等。listFile遍历目录下的文件在做文件管理功能时经常需要列出某个目录下有哪些文件。非递归遍历只列当前目录constdirFileUtil.getFilesDirPath();constfilesawaitFileUtil.listFile(dir,{recursion:false});this.addLog(listFile: [${files.join(, )}]);第二个参数是选项对象recursion: false表示只列当前层不深入子目录。递归遍历包含所有子目录文件constdirFileUtil.getFilesDirPath();constfilesFileUtil.listFileSync(dir,{recursion:true});this.addLog(listFileSync(递归):${files.length}个文件);listFileSync是同步版recursion: true会递归遍历所有子目录返回所有文件名不含目录名的数组。注意返回的是文件名不是完整路径。如果要完整路径需要自己拼接constdirFileUtil.getFilesDirPath();constfilesFileUtil.listFileSync(dir,{recursion:false});constfullPathsfiles.map(name${dir}/${name});truncate截断文件内容truncate可以把文件内容截断到指定长度多余的部分直接丢掉constpFileUtil.getFilesDirPath(undefined,demo_file.txt);awaitFileUtil.truncate(p,5);this.addLog(truncate 成功保留前5字节);第二个参数是保留的字节数。上面的例子只保留文件前 5 个字节其余全部丢弃。这个 API 在什么场景用比如限制日志文件不超过某个大小时定期截断清空文件truncate(path, 0)相当于清空注意是字节数不是字符数中文字符在 UTF-8 里占 3 字节截断时要计算好。mkdtemp创建临时目录mkdtemp根据模板创建一个唯一名称的临时目录// 异步版constprefixFileUtil.getFilesDirPath()/tmp_XXXXXX;constdirawaitFileUtil.mkdtemp(prefix);this.addLog(mkdtemp: dir);// 结果类似/data/.../files/tmp_a1b2c3// 同步版constprefixFileUtil.getFilesDirPath()/stmp_XXXXXX;constdirFileUtil.mkdtempSync(prefix);this.addLog(mkdtempSync: dir);路径末尾的XXXXXX是占位符系统会用随机字符替换它保证每次创建的目录名称唯一。适合需要独立工作目录的场景下载文件时用临时目录暂存处理完再rename到正式位置失败了整个临时目录rmdir就干净了。dup复制文件描述符dup是底层操作用于复制一个文件描述符fdconstpFileUtil.getFilesDirPath(undefined,fd_demo.txt);constfFileUtil.openSync(p,fs.OpenMode.READ_WRITE|fs.OpenMode.CREATE);constdupFileFileUtil.dup(f.fd);this.addLog(dup fd: dupFile.fd);FileUtil.closeSync(f);FileUtil.closeSync(dupFile);dup返回一个新的fs.File对象它和原来的 fd 指向同一个文件但是独立的文件描述符。使用场景把同一个文件同时交给不同模块操作每个模块有自己的 fd互不干扰。用完记得两个都关闭。utimes修改文件访问时间constpFileUtil.getFilesDirPath(undefined,fd_demo.txt);FileUtil.utimes(p,Date.now());this.addLog(utimes 更新成功);utimes更新文件的最后访问时间戳atime。Date.now()返回的是毫秒级时间戳直接传就行。这个 API 的实际用途防止缓存文件被系统认为长时间未访问而被清理按时间排序文件列表时手动更新 atimeStream 流操作流操作适合大文件场景避免一次性把整个文件读入内存。createStream异步创建流constpFileUtil.getFilesDirPath(undefined,stream_demo.txt);// 先确保文件存在awaitFileUtil.writeEasy(p,stream test\n,false);// 以 r读写模式打开流conststreamawaitFileUtil.createStream(p,r);this.addLog(createStream 成功: typeofstream);awaitstream.close();模式字符串和 C 语言的 fopen 一致r只读w只写清空a追加r读写w读写清空createStreamSync同步创建流constpFileUtil.getFilesDirPath(undefined,stream_demo.txt);conststreamFileUtil.createStreamSync(p,r);this.addLog(createStreamSync 成功: typeofstream);stream.closeSync();流用完必须关闭异步流用await stream.close()同步流用stream.closeSync()。什么时候用流什么时候直接 readText场景推荐方式文件 1MB内容是文本readText/readTextSync文件 1MB或者是二进制Stream 流需要分块读取、边读边处理Stream 流简单追加写入writeEasy需要随机读写跳到某个偏移位置fd 方式写在最后这篇的 API 用到的频率不算高但遇到特定需求时它们是最合适的工具listFile目录遍历recursion控制是否递归truncate截断文件日志限制大小时很有用mkdtemp创建唯一临时目录处理临时文件的好帮手Stream 流大文件操作的正确姿势四篇 FileUtil 文章到这里就完整了从路径到读写到管理到高级操作应该能覆盖日常 90% 以上的文件操作需求了。