filesDir、cacheDir、tempDir 傻傻分不清?看这一篇就够了
文章目录前言HarmonyOS 的沙箱目录结构getFilesDirPath最常用的路径方法getCacheDirPath 和 getTempDirPathgetUriFromPath文件路径转 URIgetFileUri / getFileName / getFileExtentionhasDirPath判断是否是绝对路径路径拼接的正确方式写在最后前言近期发现一款很有意思的HarmonyOS 三方库, 地址 pura/harmony-utils(V1.4.0) , 作者是桃花镇童长老, 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦案例demo导航展示↓↓↓↓↓↓接下来言归正传 ↓↓↓↓刚开始写 HarmonyOS 文件相关功能第一个拦路虎往往不是读写本身而是路径文件该存在哪沙箱目录怎么拿路径怎么拼接这篇文章对着FileUtilDemoPage的路径工具部分把这些问题一次性说清楚。HarmonyOS 的沙箱目录结构先建立基础认知。HarmonyOS 应用运行在沙箱里有几个常用目录目录用途持久化filesDir应用私有文件存储长期保存数据用这里持久cacheDir缓存文件系统可能在存储不足时清理非持久tempDir临时文件应用退出后不保证保留非持久简单说重要数据用filesDir缓存用cacheDir临时中转用tempDir。getFilesDirPath最常用的路径方法// 获取 HAP 的 filesDir 根路径constpFileUtil.getFilesDirPath();this.addLog(filesDir: p);这会返回类似/data/storage/el2/base/haps/entry/files的路径这是当前 HAPHarmonyOS Ability Package的私有文件目录。getFilesDirPath还支持传参拼接子目录和文件名// 拼接子目录 文件名constpFileUtil.getFilesDirPath(sub/dir,a.txt);this.addLog(完整路径: p);// 结果类似/data/storage/el2/base/haps/entry/files/sub/dir/a.txt两个参数都是可选的第一个参数子目录路径可以是多级如sub/dir第二个参数文件名这个方法在演示代码里几乎每个文件操作前都会用到是最高频的路径工具。getCacheDirPath 和 getTempDirPath// 获取缓存目录constpFileUtil.getCacheDirPath(undefined,undefined,false);this.addLog(cacheDir(App): p);// 获取临时目录constpFileUtil.getTempDirPath();this.addLog(tempDir: p);getCacheDirPath第三个参数false表示获取 App 级别的缓存目录false App 级true HAP 级。getUriFromPath文件路径转 URI这个方法不少人会忽视但在用到图片组件、文件选择器等 API 时非常关键。HarmonyOS 的很多系统 API 要求传 URI 格式形如file://...而不是原始的沙箱路径形如/data/storage/...。// 先拿到路径constpFileUtil.getFilesDirPath(undefined,demo.txt);// 再转成 URIconsturiFileUtil.getUriFromPath(p);this.addLog(URI: uri);// 结果类似file:///data/storage/el2/base/haps/entry/files/demo.txt需要记住路径和 URI 是两种格式使用时注意区分场景。getFileUri / getFileName / getFileExtention这组方法处理文件元信息// 获取 FileUri 对象包含 name、path 等属性constpFileUtil.getFilesDirPath(undefined,hello.png);constfuFileUtil.getFileUri(p);this.addLog(name:fu.name path:fu.path);getFileUri返回一个对象包含文件名 (name) 和路径 (path) 属性比手动 split 路径字符串要可靠得多。获取文件后缀constextFileUtil.getFileExtention(report.docx);this.addLog(后缀: ext);// 结果docxgetFileExtention直接传文件名就行返回不带点的后缀字符串。hasDirPath判断是否是绝对路径这个小工具方法用来区分绝对路径和相对路径// 绝对路径返回 truethis.addLog(/data/... → FileUtil.hasDirPath(/data/storage/test.txt));// 相对路径返回 falsethis.addLog(rel/path → FileUtil.hasDirPath(rel/path));在做文件操作前可以用它来验证传入的路径是否是完整的绝对路径避免路径错误导致操作失败。路径拼接的正确方式初学者容易踩的一个坑自己手动字符串拼接路径。// ❌ 不推荐容易出错多了 / 少了 / 都会出问题constpathfilesDir/subDir/fileName;// ✅ 推荐用 FileUtil.getFilesDirPath 统一处理constpathFileUtil.getFilesDirPath(subDir,fileName);getFilesDirPath内部会帮你处理斜杠问题不需要手动拼。写在最后路径工具是文件操作的基础用对了后面的读写、复制、删除才不会踩坑。核心记三点长期数据放filesDir用getFilesDirPath()拿路径路径和 URI不是同一个东西传给系统 API 时注意用getUriFromPath转换路径拼接用方法不要手动字符串拼接下一篇讲文件的读写操作。