FileUtil 文件管理篇:mkdir、copyFile、rename、unlink 一次搞定 文章目录前言所有案例方法总览创建目录删除目录复制文件copyFile vs copyFileSync重命名rename 即是移动moveFile跨路径移动删除文件unlink vs unlinkSync文件属性查询stat / access / isFile / isDirectory目录大小统计写在最后前言近期发现一款很有意思的HarmonyOS 三方库, 地址 pura/harmony-utils(V1.4.0) , 作者是桃花镇童长老, 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦案例demo导航展示↓↓↓↓↓↓接下来言归正传 ↓↓↓↓读写搞定了文件管理的另一半是目录和文件的增删改。这篇把FileUtilDemoPage里的目录创建、文件复制、重命名、移动和删除操作全部过一遍。所有案例方法总览创建目录HarmonyOS 里创建目录有三个方法各有适用场景createDir推荐的异步创建方式constdirFileUtil.getFilesDirPath(demo_async_dir);awaitFileUtil.createDir(dir);this.addLog(createDir 成功: dir);createDir是封装版内部做了路径处理如果目录已存在不会报错这个特性很实用你不需要先access检查再创建。createDirSync同步版本constdirFileUtil.getFilesDirPath(demo_sync_dir);FileUtil.createDirSync(dir);this.addLog(createDirSync 成功: dir);适合目录很快能创建完、或者确认在非 UI 线程执行的场景。mkdir(path, recursiontrue)递归创建多级目录constdirFileUtil.getFilesDirPath(a/b/c);awaitFileUtil.mkdir(dir,true);this.addLog(mkdir(recursion) 成功: dir);第二个参数true表示递归创建。a/b/c哪怕a、a/b都不存在也会一次性全部创建出来。如果传false或不传父目录不存在时会报错。删除目录constdirFileUtil.getFilesDirPath(demo_async_dir);awaitFileUtil.rmdir(dir);this.addLog(rmdir 成功);rmdir会递归删除目录及其所有内容用的时候要小心没有回收站删了就没了。复制文件copyFile vs copyFileSync// 异步复制constsrcFileUtil.getFilesDirPath(undefined,demo_file.txt);constdstFileUtil.getFilesDirPath(undefined,demo_copy.txt);awaitFileUtil.copyFile(src,dst);this.addLog(copyFile 成功);// 同步复制constsrcFileUtil.getFilesDirPath(undefined,demo_file.txt);constdstFileUtil.getFilesDirPath(undefined,demo_copy_sync.txt);FileUtil.copyFileSync(src,dst);this.addLog(copyFileSync 成功);两个参数源文件路径和目标文件路径。注意如果目标文件已存在会直接覆盖目标文件的父目录必须存在否则报错源文件必须存在否则报错所以复制前最好先确认源文件存在用accessSync目标目录也存在用mkdir确保。重命名rename 即是移动rename的名字叫重命名但实际上它也能做移动到同目录下的新名字// 重命名异步constsrcFileUtil.getFilesDirPath(undefined,demo_copy.txt);constdstFileUtil.getFilesDirPath(undefined,demo_renamed.txt);awaitFileUtil.rename(src,dst);this.addLog(rename 成功);// 重命名同步constsrcFileUtil.getFilesDirPath(undefined,demo_copy_sync.txt);constdstFileUtil.getFilesDirPath(undefined,demo_renamed_sync.txt);FileUtil.renameSync(src,dst);this.addLog(renameSync 成功);本质上renamemoverename只要在同一个文件系统内可以跨目录移动// 这样也是合法的相当于移动到 sub 目录并重命名constsrcFileUtil.getFilesDirPath(undefined,a.txt);constdstFileUtil.getFilesDirPath(sub,b.txt);awaitFileUtil.rename(src,dst);moveFile跨路径移动如果明确是移动操作用moveFile语义更清晰constsrcFileUtil.getFilesDirPath(undefined,demo_renamed.txt);constdstFileUtil.getFilesDirPath(moved_dir,moved.txt);awaitFileUtil.moveFile(src,dst,0);this.addLog(moveFile 成功);第三个参数0是冲突模式0表示如果目标已存在就覆盖。删除文件unlink vs unlinkSync// 异步删除constpFileUtil.getFilesDirPath(undefined,demo_file.txt);awaitFileUtil.unlink(p);this.addLog(unlink 删除成功);// 同步删除constpFileUtil.getFilesDirPath(undefined,demo_renamed_sync.txt);FileUtil.unlinkSync(p);this.addLog(unlinkSync 删除成功);unlink只能删单个文件不能删目录用rmdir删目录。文件属性查询stat / access / isFile / isDirectorystat获取文件详细信息constpFileUtil.getFilesDirPath(undefined,demo_file.txt);constsawaitFileUtil.stat(p);this.addLog(stat: size${s.size}isFile${s.isFile()});stat返回fs.Stat对象常用属性size文件大小字节isFile()是否是普通文件isDirectory()是否是目录access检查文件是否存在constpFileUtil.getFilesDirPath(undefined,demo_file.txt);constexistsawaitFileUtil.access(p);this.addLog(access: exists);access返回booleantrue表示文件存在。isFile / isDirectory快速判断类型constpFileUtil.getFilesDirPath(undefined,demo_file.txt);constsFileUtil.statSync(p);this.addLog(isFile:${FileUtil.isFile(p)}| isDirectory:${FileUtil.isDirectory(FileUtil.getFilesDirPath())});目录大小统计constdirFileUtil.getFilesDirPath();constsizeFileUtil.getFileDirSize(dir);this.addLog(目录大小: FileUtil.getFormatFileSize(size));getFileDirSize统计目录下所有文件的总大小递归getFormatFileSize把字节数格式化成人类可读的单位KB、MB、GB// 各单位格式化示例[0,512,1536,1024*1024,1024*1024*1024].forEach(b{this.addLog(${b}B →${FileUtil.getFormatFileSize(b)});});// 0 B → 0 B// 512 B → 512 B// 1536 B → 1.5 KB// 1048576 B → 1 MB// 1073741824 B → 1 GB写在最后文件管理的几个核心方法创建目录createDir已存在不报错、mkdir(path, true)递归创建复制copyFile/copyFileSync重命名/移动rename/renameSync删除文件unlink删目录用rmdir检查存在access/accessSync返回 boolean操作文件之前养成先检查路径、包try-catch的习惯能省掉很多不必要的崩溃排查时间。