
HarmonyOS 文件管理服务让你的应用支持删除到回收站什么是文件管理服务你有没有遇到过这种情况不小心删了一个重要文件然后就找不回来了电脑上一般有回收站删了文件还能从回收站里恢复。但手机上呢很多手机 App 删除文件就是直接删了没有后悔的机会。文件管理服务File Manager Service Kit就是来解决这个问题的。它是鸿蒙生态下的文件管理服务提供了删除到回收站的能力。简单说就是让你的 App 删除文件时不是直接删掉而是放到回收站里用户可以随时恢复。你可能会问回收站在哪在鸿蒙系统里回收站是系统级的功能用户可以在文件管理器里找到。你只需要调用文件管理服务的接口把文件移到回收站就行剩下的事情系统会帮你处理。核心功能文件管理服务目前提供的核心功能就一个删除到回收站把文件移到回收站而不是直接删除虽然功能看起来简单但这个能力非常重要。想想看你的 App 如果有文件管理功能用户肯定会期望有回收站就像电脑上的回收站一样。没有回收站的文件管理器用户用起来总是提心吊胆的生怕一不小心删错了东西。环境搭建硬件要求设备类型华为手机、平板、PC/2in1HarmonyOS 系统HarmonyOS 5.0.5 Release 及以上软件要求DevEco Studio 版本DevEco Studio 5.0.5 Release 及以上HarmonyOS SDK 版本HarmonyOS 5.0.5 Release SDK 及以上搭建步骤安装 DevEco Studio去华为开发者官网下载安装跟着提示走就行配置开发环境确保网络环境正常DevEco Studio 需要联网才能用设备调试使用真机进行调试模拟器也可以项目结构└── entry/src/main ├── ets │ ├── entryability │ │ └── EntryAbility.ets // 程序入口类 │ └── pages │ └── Index.ets // 主界面 └── resources // 资源文件目录项目结构非常简单核心逻辑都在Index.ets里。这个 Codelab 的重点就是教你调用文件管理服务的接口所以代码量不大。第一步导入模块import{fileManagerService}fromkit.FileManagerServiceKit;import{BusinessError}fromkit.BasicServicesKit;import{common}fromkit.AbilityKit;import{hilog}fromkit.PerformanceAnalysisKit;import{picker}fromkit.CoreFileKit;import{PromptAction}fromkit.ArkUI;导入的模块有点多一个个来说fileManagerService文件管理服务的核心接口我们用它来调用删除到回收站功能。这是整个文章最重要的模块BusinessError错误处理用的。华为的 Kit 接口基本都用这个来返回错误信息包括错误码和错误描述common获取上下文用的。调用文件管理服务接口时需要传入应用的上下文hilog日志工具开发调试的时候看输出用的。出了问题也能查日志建议别删picker文件选择器让用户选择要删除的文件。你想啊用户得先选中一个文件才能删除它对吧PromptAction弹出提示用的比如删除成功、删除失败这种提示框第二步定义日志标签constdomain0x0000;consttagdeleteTag;定义日志的标签方便在控制台里找到我们的日志输出。domain是日志的域tag是标签名你可以随便取只要方便识别就行。为什么要定义这个因为鸿蒙系统里会有很多日志输出如果你不加标签根本找不到自己写的日志。就像在一堆信件里找自己的信有个名字标记就好找多了。第三步创建文件选择器letcontext:common.UIAbilityContextthis.getUIContext().getHostContext()ascommon.UIAbilityContext;letpromptAction:PromptActionthis.getUIContext().getPromptAction();letselectOptions:picker.DocumentSelectOptionsnewpicker.DocumentSelectOptions();selectOptions.defaultFilePathUrifile://docs/storage/Users/currentUser;letdocumentPickernewpicker.DocumentViewPicker(context);创建文件选择器的过程我一行一行解释获取上下文context这是应用的运行环境很多接口都需要传入这个参数。你可以理解为当前页面的环境信息获取提示操作promptAction用来弹出提示信息比如 Toast 提示。不获取这个的话你就没办法弹提示了创建选择选项selectOptions可以设置默认打开的路径。这里设置为用户文件目录这样用户打开选择器时直接看到的就是自己的文件创建文件选择器documentPicker用来让用户选择文件。这个选择器是系统提供的长得和系统文件管理器一样defaultFilePathUri设置了文件选择器打开时默认显示的路径。如果你不设置这个选择器可能会打开一个默认目录用户还得自己导航到想要的目录体验不好。第四步选择文件并删除到回收站documentPicker.select(selectOptions,async(err:BusinessError,documentSelectResult:Arraystring){if(err){hilog.error(domain,tag,DocumentViewPicker.select failed with err: JSON.stringify(err));return;}// 选择成功处理文件});调用documentPicker.select打开文件选择器。用户会看到一个系统文件选择界面可以选择一个或多个文件。选择完成后回调函数会被调用如果err有值说明出了问题比如用户取消了选择打印错误信息然后 return如果err没有值说明选择成功documentSelectResult里就是用户选中的文件 URI 列表try{for(leturiofdocumentSelectResult){hilog.info(domain,tag,deleteToTrash start);constret:stringawaitfileManagerService.deleteToTrash(uri);hilog.info(domain,tag,deleteToTrash end, ret:%{public},ret);}promptAction.showToast({message:delete success,duration:5});}catch(error){hilog.error(domain,tag,error.code:${error.code}, error.message:${error.message});promptAction.showToast({message:delete failed, error.code:${error.code}, error.message:${error.message},duration:5});}这是核心逻辑我拆开来说遍历用户选择的所有文件用户可能选了多个文件所以用for...of循环处理调用fileManagerService.deleteToTrash(uri)这是整个文章最重要的 API。它不会直接删除文件而是把文件移到回收站里。用户可以在文件管理器的回收站里找到这些文件随时恢复全部成功后弹出删除成功的提示让用户知道操作完成了如果出错了弹出错误信息可能是因为文件不存在、权限不足等原因deleteToTrash的返回值是一个字符串表示操作结果。你可以根据这个返回值判断是否成功。为什么要用try...catch因为删除文件可能会失败。比如文件已经被删了、文件路径不对、没有权限等等。如果不捕获异常程序可能会崩溃。完整代码把上面的步骤合在一起完整的代码是这样的import{fileManagerService}fromkit.FileManagerServiceKit;import{BusinessError}fromkit.BasicServicesKit;import{common}fromkit.AbilityKit;import{hilog}fromkit.PerformanceAnalysisKit;import{picker}fromkit.CoreFileKit;import{PromptAction}fromkit.ArkUI;constdomain0x0000;consttagdeleteTag;EntryComponentstruct Index{build(){Column(){Button($r(app.string.select_files_to_delete)).onClick(async(){try{letcontext:common.UIAbilityContextthis.getUIContext().getHostContext()ascommon.UIAbilityContext;letpromptAction:PromptActionthis.getUIContext().getPromptAction();letselectOptions:picker.DocumentSelectOptionsnewpicker.DocumentSelectOptions();selectOptions.defaultFilePathUrifile://docs/storage/Users/currentUser;letdocumentPickernewpicker.DocumentViewPicker(context);documentPicker.select(selectOptions,async(err:BusinessError,documentSelectResult:Arraystring){if(err){hilog.error(domain,tag,DocumentViewPicker.select failed with err: JSON.stringify(err));return;}try{for(leturiofdocumentSelectResult){hilog.info(domain,tag,deleteToTrash start);constret:stringawaitfileManagerService.deleteToTrash(uri);hilog.info(domain,tag,deleteToTrash end, ret:%{public},ret);}promptAction.showToast({message:delete success,duration:5});}catch(error){hilog.error(domain,tag,error.code:${error.code}, error.message:${error.message});promptAction.showToast({message:delete failed, error.code:${error.code}, error.message:${error.message},duration:5});}});}catch(error){leterr:BusinessErrorerrorasBusinessError;hilog.error(domain,tag,DocumentViewPicker failed with err: JSON.stringify(err));}})}.height(100%).width(100%).justifyContent(FlexAlign.Center)}}整个流程就是点击按钮 → 打开文件选择器 → 用户选择文件 → 调用deleteToTrash删除到回收站 → 显示结果提示。看起来代码挺长的但其实逻辑很简单。大部分代码都是在做准备工作创建选择器、获取上下文真正干活的就一行fileManagerService.deleteToTrash(uri)。实际应用场景文件管理服务在实际开发中有很多用途文件管理器// 文件管理器中的删除功能asyncfunctiondeleteFileToTrash(uri:string){try{constret:stringawaitfileManagerService.deleteToTrash(uri);console.info(文件已移到回收站);// 可以在这里更新 UI把文件从列表里移除}catch(error){console.error(删除失败:${error.code},${error.message});// 提示用户删除失败}}在文件管理器里用户删除文件时调用deleteToTrash把文件移到回收站而不是直接删除。这样用户可以随时从回收站恢复文件。你可能会问那回收站满了怎么办鸿蒙系统的回收站有自动清理机制会按照先进先出的原则清理旧文件。你不需要自己管理回收站的空间。笔记应用// 笔记应用中删除附件asyncfunctiondeleteNoteAttachment(attachmentUri:string){try{awaitfileManagerService.deleteToTrash(attachmentUri);// 更新笔记移除附件引用console.info(附件已移到回收站);}catch(error){console.error(删除附件失败:${error.code});}}在笔记应用里用户删除笔记附件时也可以用这个功能。附件被移到回收站用户如果发现误删了可以去回收站恢复。图片编辑应用// 图片编辑应用中删除原图asyncfunctiondeleteOriginalImage(imageUri:string){try{awaitfileManagerService.deleteToTrash(imageUri);console.info(原图已移到回收站);}catch(error){console.error(删除原图失败:${error.code});}}在图片编辑应用里编辑完图片后如果用户想删除原图可以用这个功能把原图移到回收站。这样即使用户后悔了也能从回收站找回来。适用场景文件管理服务适合以下场景文件管理器文件删除和回收站管理笔记应用笔记附件的删除图片应用图片文件的删除文档应用文档文件的删除下载管理器下载文件的删除注意事项文件权限删除文件前需要确保对文件有读写权限。可以通过文件选择器让用户授权这是最简单的方式文件 URI要确保传入的文件 URI 是有效的否则会删除失败。URI 格式一般是file://docs/...回收站管理删除到回收站的文件会占用存储空间提醒用户定期清理回收站错误处理要做好错误处理比如文件不存在、权限不足等情况。不要让程序因为删除失败就崩溃用户体验删除前最好给用户一个确认提示避免误删。毕竟移到回收站虽然可以恢复但多一步确认总是好的核心流程图删除文件到回收站的完整流程否是是否用户点击删除按钮创建文件选择器打开系统文件选择界面用户是否选择了文件?取消操作获取文件 URI 列表遍历每个文件 URI调用 deleteToTrash 移到回收站操作是否成功?弹出删除成功提示弹出删除失败提示用户可在回收站恢复文件文件管理服务的应用场景文件管理服务文件管理器笔记应用图片编辑应用下载管理器文件删除与回收站管理笔记附件删除原图删除下载文件清理用户可随时从回收站恢复总结文件管理服务让你的应用支持删除到回收站核心流程导入文件管理服务模块创建文件选择器让用户选择要删除的文件调用deleteToTrash把文件移到回收站处理成功和失败的情况虽然功能看起来简单但删除到回收站是一个非常实用的功能。它让用户不再担心误删文件提升了应用的用户体验。如果你的 App 有文件管理功能一定要加上这个能力。