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

简介: FileUtil是HarmonyOS工具库harmony-utils中的文件操作工具类,提供丰富的文件管理功能,包括路径处理、文件读写、目录操作、文件属性获取等。它简化了HarmonyOS应用开发中的文件操作流程,提升开发效率。

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三方库

目录
相关文章
Arkts http数据请求
Arkts http数据请求
1149 0
|
存储 数据管理 数据格式
数据治理 vs. 数据管理:别再傻傻分不清!
数据治理 vs. 数据管理:别再傻傻分不清!
734 10
|
人工智能 自然语言处理 开发者
HarmonyOS NEXT~鸿蒙开发利器:CodeGenie AI辅助编程工具全面解析
鸿蒙开发迎来新利器!DevEco CodeGenie 是华为推出的 AI 辅助编程工具,专为 HarmonyOS NEXT 开发者设计。它具备智能代码生成(支持 ArkTS 和 C++)、精准知识问答以及万能卡片生成三大核心功能,大幅提升编码效率。通过与 DeepSeek 深度整合,CodeGenie 实现流畅的问答体验,帮助开发者解决技术难题。无论是新手还是资深开发者,都能从中受益,享受更智能高效的开发过程。快来体验吧!
1273 5
|
JSON JavaScript 前端开发
HarmonyOS NEXT实战:接入和使用axios
HarmonyOS Next 实战中,使用 Axios 可实现高效网络请求。Axios 是基于 Promise 的库,支持 GET、POST 等方法,并具备拦截器、自动 JSON 转换等功能。适配 OpenHarmony 后,仍保留其原有特性。需安装 @ohos/axios 并配置网络权限,可创建工具类统一管理请求与响应。
682 0
|
存储 SQL 关系型数据库
HarmonyOS Next快速入门:RelationalStore关系型数据库
本课程《HarmonyOS Next快速入门》涵盖HarmonyOS应用开发中的关系型数据库使用,介绍基于SQLite的持久化存储、适用场景及开发实践,适用于教育与初学者。
544 0
|
人工智能 自然语言处理 IDE
【HarmonyOS 5】鸿蒙CodeGenie AI辅助编程工具详解
1、CodeGenie是什么? CodeGenie (代码精灵)作为鸿蒙DevEco IDE自带的AI辅助编码工具。
974 0
|
JSON 前端开发 网络架构
鸿蒙开发:一文探究Navigation路由组件
如果你还在使用router做为页面跳转,建议切换Navigation组件作为应用路由框架,不为别的,因为官方目前针对router已不在推荐。
1091 101
鸿蒙开发:一文探究Navigation路由组件
|
数据库 Android开发 开发者
Android常用的room增删改查语句(外部数据库)
本文分享了将一个原生数据库驱动的单词APP重构为使用Room库的过程及遇到的问题,重点解决了Room中增删改查的常用语句实现。文章通过具体示例(以“forget”表为例),详细展示了如何定义实体类、Dao接口、Database类以及Repository和ViewModel的设计与实现。同时,提供了插入、删除、更新和查询数据的代码示例,包括模糊查询、分页加载等功能。此外,针对外部数据库导入问题,作者建议可通过公众号“计蒙不吃鱼”获取更多支持。此内容适合有一定Room基础的开发者深入学习。
420 0
Android常用的room增删改查语句(外部数据库)
|
存储 运维 负载均衡
HarmonyOS Next 端云一体化(1)
HarmonyOS Next端云一体化开发简介:借助Cloud Foundation Kit,开发者可便捷使用云函数、云数据库和云存储等服务,专注于业务逻辑。本文涵盖应用场景(如应用后端、计算密集型任务等)、资源介绍、项目创建流程(AGC平台与DevEco Studio配合)、云端环境操作及本地目录结构解析。建议优先使用DevEco Studio进行开发以提升体验,为深入学习打下基础。
648 6
HarmonyOS Next 端云一体化(1)
|
API 开发者
HarmonyOS:ArkTS Path 组件自学指南
在鸿蒙应用开发中,绘制复杂图形常面临传统布局方式难以满足需求的问题。ArkTS 的 Path 组件提供了解决方案,如同一把“神奇画笔”,支持通过灵活的命令和属性绘制直线、曲线、椭圆弧等多样图形。本文详细介绍了 Path 组件从 API Version 7 起的功能特性,包括 `commands`、`fill`、`stroke` 等核心属性,以及各类绘图命令如 `M`(移动)、`L`(直线)、`C`(贝塞尔曲线)等。结合示例代码,展示了如何绘制简单直线到复杂曲线图形,并拓展了颜色、透明度和线条样式的自定义方法。掌握 Path 组件,可为应用带来更丰富生动的视觉体验,助力开发者实现创意绘图需求。
669 21