
这个功能解决什么问题HarmonyOS NEXT 的文件操作看似很简单就三个 API。但很多开发者在第一次接触fileManager.create、fileManager.delete和fileManager.rename时容易忽略一个关键点同步与异步的选择。这个问题不搞清楚代码在真机上跑起来可能会遇到应用无响应ANR或者回调结果与预期不符。Core File Kit提供了文件基础服务它的核心定位是统一管理应用沙箱内的文件。它适合的场景包括应用数据缓存文件的管理下载资源的临时存储与清理用户配置文件的持久化不适合的场景跨应用文件共享那是File Sharing Kit的活大文件的高性能流式读写那个需要FileIO同步 vs 异步怎么选调性同步调用异步调用适用场景小文件、关键路径、简单操作大文件、用户交互频繁、耗时操作调用方式直接返回结果回调或 Promise风险阻塞主线程ANR回调地狱需注意生命周期实际项目里我推荐优先用异步。同步虽然写起来方便但文件操作如果卡住整个 UI 线程都会冻住。哪怕只是创建一个空文件在文件系统繁忙时也可能会产生几十毫秒的延迟。环境说明DevEco Studio 版本DevEco Studio 6.1.0 及以上 HarmonyOS SDK 版本HarmonyOS 6.1.0(23) 及以上 目标设备手机/平板核心实现1. 创建空文件这一步比较简单但有个坑文件路径必须已存在。import{fileManager}fromkit.CoreFileKit;letcontextgetContext(this);letsandboxDircontext.filesDir;letfilePathsandboxDir/demo.txt;// 同步创建try{letfilefileManager.createSync(filePath);console.info(create file successfile.name);}catch(err){console.error(create file failerr.message);}// 异步创建fileManager.create(filePath).then((file){console.info(create file successfile.name);}).catch((err){console.error(create file failerr.message);});2. 删除指定文件删除操作没有回收站一旦执行数据就没了。// 同步删除try{fileManager.deleteSync(filePath);console.info(delete file success);}catch(err){console.error(delete file failerr.message);}// 异步删除fileManager.delete(filePath).then((){console.info(delete file success);}).catch((err){console.error(delete file failerr.message);});3. 重命名文件重命名涉及目标路径如果目标路径已有文件会直接覆盖。letnewPathsandboxDir/new_demo.txt;// 同步重命名try{fileManager.renameSync(filePath,newPath);console.info(rename file success);}catch(err){console.error(rename file failerr.message);}// 异步重命名fileManager.rename(filePath,newPath).then((){console.info(rename file success);}).catch((err){console.error(rename file failerr.message);});这里需要注意rename只能在同一文件系统内移动。跨沙箱目录重命名会失败。常见问题问题1权限申请后文件操作仍然失败现象调用了requestPermission应用有读写权限但create返回错误码13900001。原因HarmonyOS 的文件权限分两个层级应用沙箱内权限和沙箱外权限。Core File Kit的create等 API 只在应用沙箱内工作不需要单独申请fileManager.Permission。如果你误申请了沙箱外权限反而可能引起生命周期冲突。解法Core File Kit的文件操作不需要任何运行时权限申请。沙箱路径天然可读写。如果你用到沙箱外路径如download/目录才需要额外权限。问题2异步回调中的 UI 状态同步现象异步删除文件成功后页面列表没有更新。原因异步回调在非 UI 线程执行直接修改State变量不会触发刷新。解法在回调里通过Watch或 wrapped callback 通知 UI 线程。StatefileList:string[][];onDeleteFile(path:string){fileManager.delete(path).then((){// 必须在主线程修改状态this.fileListthis.fileList.filter(ff!path);}).catch((err){console.error(delete failerr.message);});}最佳实践不要在build()函数中直接调用文件操作。build()会频繁触发每次创建一个新的文件流会导致内存泄漏。建议在aboutToAppear()或按钮事件中触发。创建文件前先检查目录是否存在。createSync不会自动创建父目录。如果父目录不存在会直接报错。建议用accessSync先检查。异步链式调用优先于嵌套。多步文件操作创建 - 写入 - 删除推荐用 Promise 链避免回调嵌套。Demo 入口EntryComponentstruct FileDemoPage{StatefileName:stringtest.txt;Statelog:string;build(){Column(){Button(同步创建文件).onClick((){this.syncCreate();})Button(异步删除文件).onClick((){this.asyncDelete();})Text(this.log).fontSize(14)}.padding(20)}syncCreate(){letcontextgetContext(this);letfilePathcontext.filesDir/this.fileName;try{fileManager.createSync(filePath);this.log创建成功;}catch(err){this.log创建失败: err.message;}}asyncDelete(){letcontextgetContext(this);letfilePathcontext.filesDir/this.fileName;fileManager.delete(filePath).then((){this.log删除成功;}).catch((err){this.log删除失败: err.message;});}}FAQQ为什么真机能创建文件模拟器返回 -1A模拟器的文件系统路径与真机不同。filesDir在模拟器上可能指向一个只读路径。建议在真机上测试文件写入功能。Q为什么重命名后原始文件还存在A检查一下目标路径是否写了完整路径。rename相当于移动重命名。如果目标路径为空或错误文件会留在原地。Q删除大文件后磁盘空间没有立即释放AHarmonyOS 文件系统对删除操作采用延迟回收机制。空间会在系统低峰期回收几秒内不会看到空间增加。这是正常行为。示例代码地址项目地址