写点什么

harmony-utils 之 FileUtil,文件相关工具类

  • 2025-06-25
    安徽
  • 本文字数:7760 字

    阅读完需:约 25 分钟

harmony-utils 之 FileUtil,文件相关工具类

harmony-utils 简介与说明



harmony-utils 一款功能丰富且极易上手的 HarmonyOS 工具库,借助众多实用工具类,致力于助力开发者迅速构建鸿蒙应用。其封装的工具涵盖了 APP、设备、屏幕、授权、通知、线程间通信、弹框、吐司、生物认证、用户首选项、拍照、相册、扫码、文件、日志,异常捕获、字符、字符串、数字、集合、日期、随机、base64、加密、解密、JSON 等一系列的功能和操作,能够满足各种不同的开发需求。


picker_utils 是 harmony-utils 拆分出来的一个子库,包含 PickerUtil、PhotoHelper、ScanUtil。


下载安装


ohpm i @pura/harmony-utils


ohpm i @pura/picker_utils


  //全局初始化方法,在UIAbility的onCreate方法中初始化 AppUtil.init()  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {    AppUtil.init(this.context);  }
复制代码

API 方法与使用


getFilesDirPath 获取文件目录下的文件夹路径或文件路径
let path1 = FileUtil.getFilesDirPath('');let path2 = FileUtil.getFilesDirPath("", "TEST.txt");let path3 = FileUtil.getFilesDirPath('download/wps/ppt', 'dev.text');let path4 = FileUtil.getFilesDirPath("download/wps/wps");let path5 = FileUtil.getFilesDirPath(`${getContext().filesDir}/download/apk`, "app.apk");let path6 = FileUtil.getFilesDirPath(`${getContext().filesDir}/download/wps/ppt`);
复制代码
getCacheDirPath 获取缓存目录下的文件夹路径或文件路径
 let path7 = FileUtil.getCacheDirPath('download/wps/ppt', 'dev_xs.text');
复制代码
getTempDirPath 获取临时目录下的文件夹路径或文件路径
let path8 = FileUtil.getTempDirPath('download/wps/ppt', 'dev_max.text');
复制代码
hasDirPath 判断是否是完整路径
 let hasDirPath1 = FileUtil.hasDirPath("download/wps/测试.PDF"); let hasDirPath2 = FileUtil.hasDirPath(`${FileUtil.getFilesDirPath("download/wps", "测试文档.doc")}`);
复制代码
getFileUri 通过 URI 或路径,获取 FileUri
let filePath = FileUtil.getFilesDirPath('download/wps/txt', 'demo.txt');let fileUri = FileUtil.getFileUri(filePath);
复制代码
getFileName 通过 URI 或路径,获取文件名
let filePath = FileUtil.getFilesDirPath('download/wps/txt', 'demo.txt');let name = FileUtil.getFileName(filePath);
复制代码
getFilePath 通过 URI 或路径,获取文件路径
let uri = "file://com.tong.yuyan.utils/data/storage/el2/base/haps/entry/files/download/wps/txt/demo.txt";let filePath = FileUtil.getFilePath(strUri);
复制代码
getParentUri 通过 URI 或路径,获取对应文件父目录的 URI
let filePath = FileUtil.getFilesDirPath('download/wps/txt', 'demo.txt');if (FileUtil.accessSync(filePath)) {  let parentUri = FileUtil.getParentUri(filePath);} else {  ToastUtil.showToast("文件不存在,请先创建和写入");}
复制代码
getParentPath 通过 URI 或路径,获取对应文件父目录的路径名
let filePath = FileUtil.getFilesDirPath('download/wps/txt', 'demo.txt');if (FileUtil.accessSync(filePath)) {  let parentPath = FileUtil.getParentPath(filePath);} else {  ToastUtil.showToast("文件不存在,请先创建和写入");}
复制代码
getUriFromPath 以同步方法获取文件 URI
let filePath = FileUtil.getFilesDirPath('download/wps/txt', 'demo.txt');let uri = FileUtil.getUriFromPath(filePath);
复制代码
getFileExtention 根据文件名获取文件后缀
let fileExtention = FileUtil.getFileExtention("/data/storage/el2/base/haps/entry/files/download/demo.txt");let fileExtention2 = FileUtil.getFileExtention("妹纸.png");
复制代码
getFileDirSize 获取指定文件夹下所有文件的大小或指定文件大小
let path = FileUtil.getFilesDirPath("");let fileDirSize = FileUtil.getFileDirSize(path);ToastUtil.showToast(`文件夹下所有文件的大小:${fileDirSize}`);
复制代码
isFile 判断文件是否是普通文件
let filePath = FileUtil.getFilesDirPath('download/wps/txt', 'demo.txt');if (FileUtil.accessSync(filePath)) {  let isFile = FileUtil.isFile(filePath);} else {  ToastUtil.showToast("文件不存在,请先创建和写入");}
复制代码
isDirectory 判断文件是否是目录
let filePath = FileUtil.getFilesDirPath('download/wps/txt', 'demo.txt');if (FileUtil.accessSync(filePath)) {  let isDirectory = FileUtil.isDirectory(filePath);} else {  ToastUtil.showToast("文件不存在,请先创建和写入");}
复制代码
rename 重命名文件或文件夹
let path = FileUtil.getFilesDirPath("", "test_cpoy.txt");let path2 = FileUtil.getFilesDirPath("", "test_cpoy2.txt");if (FileUtil.accessSync(path)) {  FileUtil.rename(path, path2);  ToastUtil.showToast("重命名成功");} else {  ToastUtil.showToast("文件不存在,请先创建或拷贝 目标文件")}
复制代码
mkdir 创建目录,当 recursion 指定为 true,可多层级创建目录
let filePath = FileUtil.getFilesDirPath('app/download/test/wps/txt');FileUtil.mkdirSync(filePath);
复制代码
rmdir 删除整个目录
let dirPath = FileUtil.getFilesDirPath("");FileUtil.rmdir(dirPath).then(() => {  ToastUtil.showToast("删除整个目录成功");});
复制代码
unlink 删除单个文件
let filePath = FileUtil.getFilesDirPath('download/wps/txt', 'demo.txt');FileUtil.unlink(filePath).then(() => {  ToastUtil.showToast("删除单个文件成功");}).catch((err: BusinessError) => {  ToastUtil.showToast("删除单个文件失败!");});
复制代码
access 检查文件是否存在
let filePath = FileUtil.getFilesDirPath('download/wps/txt', 'demo.txt');let bl = FileUtil.accessSync(filePath);
复制代码
open 打开文件,支持使用 URI 打开文件
let path = FileUtil.getFilesDirPath("", "test.txt");let file = FileUtil.openSync(path);
复制代码
read 从文件读取数据
let path = FileUtil.getFilesDirPath("", "test.txt");let file = FileUtil.openSync(path);FileUtil.writeSync(file.fd, `"HUAWEI MatePad 11.5"S 对应的API版本是多少?`)FileUtil.closeSync(file.fd); //关闭文件file = FileUtil.openSync(path);let buffer: ArrayBuffer = new ArrayBuffer(180);FileUtil.readSync(file.fd, buffer);let bufferStr = StrUtil.bufferToStr(buffer);FileUtil.closeSync(file.fd); //关闭文件
复制代码
readText 基于文本方式读取文件(即直接读取文件的文本内容)
let filePath = FileUtil.getFilesDirPath('download/wps/txt', 'demo.txt');if (FileUtil.accessSync(filePath)) {  let txt = FileUtil.readTextSync(filePath);  LogUtil.info(txt);} else {  ToastUtil.showToast("文件不存在,请先创建和写入")}
复制代码
write 将数据写入文件
let path = FileUtil.getFilesDirPath("", "test.txt");let file = FileUtil.openSync(path);FileUtil.writeSync(file.fd, `"HUAWEI MatePad 11.5"S 对应的API版本是多少?`)FileUtil.closeSync(file.fd); //关闭文件
复制代码
writeEasy 将数据写入文件,并关闭文件
let filePath = FileUtil.getFilesDirPath('download/wps/txt', 'demo.txt');FileUtil.writeEasy(filePath, "harmony-utils 一款高效的OpenHarmony/HarmonyOS工具包。帮助开发者快速构建鸿蒙应用。");            
复制代码
close 关闭文件
let path = FileUtil.getFilesDirPath("", "test.txt");let file = FileUtil.openSync(path);FileUtil.closeSync(file.fd); //关闭文件
复制代码
stat 获取文件详细属性信息
let filePath = FileUtil.getFilesDirPath('download/wps/txt', 'demo.txt');if (FileUtil.accessSync(filePath)) {  let stat = FileUtil.statSyncfilePath);  let jsonStr = `${stat.ino} - ${stat.mode} - ${stat.uid} - ${stat.gid} - ${stat.size} - ${stat.atime} - ${stat.mtime} - ${stat.isDirectory()} - ${stat.isFile()}`;  LogUtil.info(jsonStr);} else {  ToastUtil.showToast("文件不存在,请先创建和写入 目标文件")}
复制代码
listFile 列出文件夹下所有文件名,支持递归列出所有文件名(包含子目录下),支持文件过滤
let dirPath = FileUtil.getFilesDirPath("");let listFile = FileUtil.listFileSync(dirPath, { recursion: true });let listFileStr = listFile.join('\n');
复制代码
copyFile 复制文件
let filePath = FileUtil.getFilesDirPath('download/wps/txt', 'demo.txt')let path = FileUtil.getFilesDirPath("download/wps", "test_cpoy.txt");if (FileUtil.accessSync(filePath)) {  FileUtil.copyFile(filePath, path).then(() => {    let size = FileUtil.lstatSync(path).size;    ToastUtil.showToast("文件拷贝成功:" + size);  })} else {  ToastUtil.showToast("文件不存在,请先创建和写入 目标文件");}
复制代码
copy 拷贝文件或者目录,支持拷贝进度监听
let path = FileUtil.getFilesDirPath("download");let path2 = FileUtil.getFilesDirPath("copy目录");if (FileUtil.accessSync(path)) {  let progressListener: fs.ProgressListener = (progress: fs.Progress) => {    LogUtil.info(`progressSize: ${progress.processedSize}, totalSize: ${progress.totalSize}`);  };  FileUtil.copy(FileUtil.getUriFromPath(path), FileUtil.getUriFromPath(path2),    { "progressListener": progressListener }).then(() => {    let size = FileUtil.lstatSync(path2).size;    ToastUtil.showToast("文件夹拷贝成功:" + size);  }).catch((err: BusinessError) => {    ToastUtil.showToast("文件夹拷贝异常:" + err.message);  })} else {  ToastUtil.showToast("文件夹不存在,请先创建");}
复制代码
copyDir 复制源文件夹至目标路径下,只能复制沙箱里的文件夹
let path = FileUtil.getFilesDirPath("download");let path2 = FileUtil.getFilesDirPath("copyDir目录");if (FileUtil.accessSync(path)) {  FileUtil.copyDir(path, path2).then(() => {    let size = FileUtil.lstatSync(path2).size;    ToastUtil.showToast("文件夹拷贝成功:" + size);  }).catch((err: BusinessError) => {    ToastUtil.showToast("文件夹拷贝异常:" + err.message);  })} else {  ToastUtil.showToast("文件夹不存在,请先创建");}
复制代码
moveFile 移动文件
let path = FileUtil.getFilesDirPath("download/wps", "test_cpoy.txt");let path2 = FileUtil.getFilesDirPath("download/txt", "test_cpoy.txt");if (FileUtil.accessSync(path)) {  FileUtil.moveFile(path, path2).then(() => {    ToastUtil.showToast("移动文件成功");  })} else {  ToastUtil.showToast("文件不存在")}
复制代码
moveDir 移动源文件夹至目标路径下
let path = FileUtil.getFilesDirPath("copyDir目录");let path2 = FileUtil.getFilesDirPath("moveDir目录");if (FileUtil.accessSync(path)) {  FileUtil.moveDir(path, path2).then(() => {    ToastUtil.showToast("文件夹移动成功");  }).catch((err: BusinessError) => {    ToastUtil.showToast("文件夹移动异常:" + err.message);  })} else {  ToastUtil.showToast("文件夹不存在,请先创建");}
复制代码
truncate 截断文件
let filePath = FileUtil.getFilesDirPath('download/wps/txt', 'demo.txt');FileUtil.truncate(filePath, 15);
复制代码
lstat 获取链接文件信息
let filePath = FileUtil.getFilesDirPath('download/wps/txt', 'demo.txt');let stat = FileUtil.lstatSync(filePath);let jsonStr = `${stat.ino} - ${stat.mode} - ${stat.uid} - ${stat.gid} - ${stat.size} - ${stat.atime} - ${stat.mtime} - ${stat.isDirectory()} - ${stat.isFile()}`;LogUtil.info(jsonStr);
复制代码
fsync 同步文件数据
let filePath = FileUtil.getFilesDirPath('download/wps/txt', 'demo.txt');let file = fs.openSync(filePath);FileUtil.fsync(file.fd).then(() => {  LogUtil.info("同步成功!");}).catch((err: BusinessError) => {  LogUtil.error("同步失败, error信息: " + err.message + ", error code: " + err.code);}).finally(() => {  FileUtil.closeSync(file);});
复制代码
fdatasync 实现文件内容数据同步
let filePath = FileUtil.getFilesDirPath('download/wps/txt', 'demo.txt');let file = FileUtil.openSync(filePath);FileUtil.fdatasync(file.fd).then(() => {  LogUtil.info("sync data succeed");}).catch((err: BusinessError) => {  LogUtil.error("sync data failed with error message: " + err.message + ", error code: " + err.code);}).finally(() => {  FileUtil.closeSync(file);});
复制代码
createStream 基于文件路径打开文件流
let filePath = FileUtil.getFilesDirPath('download/wps/txt', 'demo.txt');FileUtil.createStream(filePath, "a+").then((stream: fs.Stream) => {  stream.closeSync();  LogUtil.info("createStream succeed");}).catch((err: BusinessError) => {  LogUtil.error("createStream failed with error message: " + err.message + ", error code: " + err.code);});
复制代码
fdopenStream 基于文件描述符打开文件流
let filePath = FileUtil.getFilesDirPath('download/wps/txt', 'demo.txt');let file = FileUtil.openSync(filePath);FileUtil.fdopenStream(file.fd, "r+").then((stream: fs.Stream) => {  console.info("openStream succeed");  stream.closeSync();}).catch((err: BusinessError) => {  console.error("openStream failed with error message: " + err.message + ", error code: " + err.code);  fs.closeSync(file); //文件流打开失败后,文件描述符需要手动关闭});
复制代码
mkdtemp 创建临时目录
let path = FileUtil.getFilesDirPath() + "/临时目录/download/temp";let tempPath = FileUtil.mkdtempSync(path);ToastUtil.showToast("操作成功: " + tempPath);
复制代码
dup 将文件描述符转化为 File
let filePath = FileUtil.getFilesDirPath('download/wps/txt', 'demo.txt');let file = FileUtil.openSync(filePath, fs.OpenMode.READ_WRITE);let fd: number = file.fd;let file2 = FileUtil.dup(fd);LogUtil.info("The name of the file2 is " + file2.name);FileUtil.closeSync(file);FileUtil.closeSync(file2);
复制代码
utimes 修改文件最近访问时间属性
let filePath = FileUtil.getFilesDirPath('download/wps/txt', 'demo_time.txt');let file = FileUtil.openSync(filePath, fs.OpenMode.READ_WRITE);FileUtil.writeSync(file.fd, "harmony-utils一款高效的OpenHarmony/HarmonyOS工具包。帮助开发者快速构建鸿蒙应用!");FileUtil.closeSync(file);FileUtil.utimes(filePath, new Date().getTime());
复制代码
getFormatFileSize 格式化文件大小
let sizeStr = FileUtil.getFormatFileSize(1020450901);ToastUtil.showToast(`文件大小:${sizeStr}`);
复制代码
checkPersistentPermission 校验所选择的多个文件或目录 URI 持久化授权。(需要权限:ohos.permission.FILE_ACCESS_PERSIST)
//cacheUri 见使用案例源码if (StrUtil.isNotEmpty(this.cacheUri)) {  let policie: fileShare.PolicyInfo = {    uri: this.cacheUri,    operationMode: fileShare.OperationMode.READ_MODE | fileShare.OperationMode.WRITE_MODE  }  FileUtil.checkPersistentPermission([policie]).then(() => {    this.jsonStr = `检查权限,成功!\n${this.cacheUri}`;  }).catch((err: BusinessError) => {    this.jsonStr = `检查权限,异常:\n${JSON.stringify(err)}`;  });} else {  ToastUtil.showToast("请先调用saveDocument()保存文件,在操作!");}
复制代码
persistPermission 对所选择的多个文件或目录 URI 持久化授权。(需要权限:ohos.permission.FILE_ACCESS_PERSIST)
//cacheUri 见使用案例源码if (StrUtil.isNotEmpty(this.cacheUri)) {  FileUtil.persistPermissionEasy([this.cacheUri]).then(() => {    this.jsonStr = `授权,已授权!\n${this.cacheUri}`;    let file = FileUtil.openSync(this.cacheUri); //uri是否可用,读取文件    this.jsonStr = this.jsonStr + `\n\n文件名:${file.name}`;    LogUtil.error("file: " + file.name);  }).catch((err: BusinessError) => {    this.jsonStr = `授权,异常:\n${JSON.stringify(err)}`;  });} else {  ToastUtil.showToast("请先调用saveDocument()保存文件,在操作!");}
复制代码
revokePermission 对所选择的多个文件或目录 uri 取消持久化授权。(需要权限:ohos.permission.FILE_ACCESS_PERSIST)
//cacheUri 见使用案例源码if (StrUtil.isNotEmpty(this.cacheUri)) {  FileUtil.revokePermissionEasy([this.cacheUri]).then(() => {    this.jsonStr = `移除授权,成功!`;    let file = FileUtil.openSync(this.cacheUri); //uri是否可用,读取文件    this.jsonStr = this.jsonStr + `\n\n文件名:${file.name}`;    LogUtil.error("file: " + file.name);  }).catch((err: BusinessError) => {    this.jsonStr = `移除授权,异常:\n${JSON.stringify(err)}`;  });} else {  ToastUtil.showToast("请先调用saveDocument()保存文件,在操作!");}
复制代码
activatePermission 对已经持久化授权的权限进行使能操作,否则已经持久化授权的权限仍存在不能使用的情况。(需要权限:ohos.permission.FILE_ACCESS_PERSIST)
//cacheUri 见使用案例源码if (StrUtil.isNotEmpty(this.cacheUri)) {  FileUtil.activatePermissionEasy([this.cacheUri]).then(() => {    this.jsonStr = `使能操作,成功!\n${this.cacheUri}`;  }).catch((err: BusinessError) => {    this.jsonStr = `使能操作,异常:\n${JSON.stringify(err)}`;  })} else {  ToastUtil.showToast("请先调用saveDocument()保存文件,在操作!");}
复制代码
deactivatePermission 取消使能授权过的多个文件或目录。(需要权限:ohos.permission.FILE_ACCESS_PERSIST)
//cacheUri 见使用案例源码if (StrUtil.isNotEmpty(this.cacheUri)) {  FileUtil.deactivatePermissionEasy([this.cacheUri]).then(() => {    this.jsonStr = `取消使能授权,成功!\n${this.cacheUri}`;  }).catch((err: BusinessError) => {    this.jsonStr = `取消使能授权,异常:\n${JSON.stringify(err)}`;  })} else {  ToastUtil.showToast("请先调用saveDocument()保存文件,在操作!");}
复制代码

创作不易,请给童长老点赞👍



https://github.com/787107497/harmony-utils


https://gitee.com/tongyuyan/harmony-utils


OpenHarmony三方库


童长老CSDN博客

用户头像

还未添加个人签名 2025-05-14 加入

还未添加个人简介

评论

发布
暂无评论
harmony-utils之FileUtil,文件相关工具类_HarmonyOS_桃花镇童长老_InfoQ写作社区