1# 开发用户文件管理器(仅对系统应用开放) 2 3OpenHarmony预置了FileManager文件管理器。系统应用开发者也可以根据需要,按以下指导自行开发文件管理器。 4 5## 接口说明 6 7开发用户文件管理器的相关API详细介绍请参见[API参考](../reference/apis/js-apis-fileAccess.md)。 8 9## 开发步骤 10 111. 权限配置和导入模块。 12 申请ohos.permission.FILE_ACCESS_MANAGER和ohos.permission.GET_BUNDLE_INFO_PRIVILEGED权限,配置方式请参见[访问控制授权申请](../security/accesstoken-guidelines.md)。 13 14 > **说明:** 15 > 16 > ohos.permission.FILE_ACCESS_MANAGER是使用文件访问框架接口的基础权限。 17 > 18 > ohos.permission.GET_BUNDLE_INFO_PRIVILEGED权限可以用于查询系统内当前支持的文件管理服务端应用信息。 19 202. 导入依赖模块。 21 22 ```ts 23 import fileAccess from '@ohos.file.fileAccess'; 24 import fileExtensionInfo from '@ohos.file.fileExtensionInfo'; 25 ``` 26 27 其中fileAccess提供了文件基础操作的API,fileExtensionInfo提供了应用开发的关键结构体。 28 293. 查询设备列表。 30 开发者可以获取当前系统所有文件管理服务端管理的设备属性,也可以获取某个文件管理服务端管理的设备属性。应用开发者可以按需过滤设备。 31 32 在文件访问框架中,使用RootInfo用于表示设备的属性信息。以下示例可以获取所有设备的RootInfo。 33 34 ```ts 35 import common from '@ohos.app.ability.common'; 36 import { BusinessError } from '@ohos.base'; 37 import { Filter } from '@ohos.file.fs'; 38 39 // 获取应用上下文 40 let context = getContext(this) as common.UIAbilityContext; 41 42 // 创建连接系统内所有文件管理服务端的helper对象 43 let fileAccessHelperAllServer: fileAccess.FileAccessHelper; 44 function createFileAccessHelper(): void { 45 try { // this.context是EntryAbility传过来的Context 46 fileAccessHelperAllServer = fileAccess.createFileAccessHelper(context); 47 if (!fileAccessHelperAllServer) { 48 console.error("createFileAccessHelper interface returns an undefined object"); 49 } 50 } catch (err) { 51 let error: BusinessError = err as BusinessError; 52 console.error("createFileAccessHelper failed, errCode:" + error.code + ", errMessage:" + error.message); 53 } 54 } 55 let rootInfos: Array<fileAccess.RootInfo> = []; 56 async function getRoots(): Promise<void>{ 57 let rootIterator: fileAccess.RootIterator; 58 let isDone: boolean = false; 59 try { 60 rootIterator = await fileAccessHelperAllServer.getRoots(); 61 if (!rootIterator) { 62 console.error("getRoots interface returns an undefined object"); 63 return; 64 } 65 while (!isDone) { 66 let result = rootIterator.next(); 67 console.info("next result = " + JSON.stringify(result)); 68 isDone = result.done; 69 if (!isDone) 70 rootInfos.push(result.value); 71 } 72 } catch (err) { 73 let error: BusinessError = err as BusinessError; 74 console.error("getRoots failed, errCode:" + error.code + ", errMessage:" + error.message); 75 } 76 } 77 ``` 78 794. 浏览目录。 80 在文件访问框架中,使用FileInfo表示一个文件(目录)的基础信息。开发者可以使用listfile接口遍历下一级所有文件(目录)的迭代器对象;也可以通过scanfile过滤指定目录,获取满足条件的迭代器对象。 81 82 listfile和scanfile接口当前支持RootInfo对象调用,可用于支撑遍历下一级文件或过滤整个目录树。同时,接口也支持FileInfo对象调用,用于支撑遍历下一级文件或过滤指定目录。 83 84 ```ts 85 import { BusinessError } from '@ohos.base'; 86 import { Filter } from '@ohos.file.fs'; 87 88 // 从根目录开始 89 let rootInfo: Array<fileAccess.RootInfo> = rootInfos[0]; 90 let fileInfos: Array<fileAccess.FileInfo> = []; 91 let isDone: boolean = false; 92 let filter: Filter = {suffix : [".txt", ".jpg", ".xlsx"]}; // 设定过滤条件 93 try { 94 let fileIterator: string = rootInfo.listFile(); // 遍历设备rootinfos[0]的根目录,返回迭代器对象 95 // let fileIterator = rootInfo.scanFile(filter); // 过滤设备rootinfos[0]满足指定条件的文件信息,返回迭代对象 96 if (!fileIterator) { 97 console.error("listFile interface returns an undefined object"); 98 } 99 while (!isDone) { 100 let result: boolean = fileIterator.next(); 101 console.info("next result = " + JSON.stringify(result)); 102 isDone = result.done; 103 if (!isDone) 104 fileInfos.push(result.value); 105 } 106 } catch (err) { 107 let error: BusinessError = err as BusinessError; 108 console.error("listFile failed, errCode:" + error.code + ", errMessage:" + error.message); 109 } 110 111 // 从指定的目录开始 112 let fileInfoDir: Array<fileAccess.FileInfo> = fileInfos[0]; // fileInfoDir 表示某个目录信息 113 let subFileInfos: Array<fileAccess.FileInfo> = []; 114 let isDone02: boolean = false; 115 let filter02: Filter = {suffix : [".txt", ".jpg", ".xlsx"]}; // 设定过滤条件 116 try { 117 let fileIterator: string = fileInfoDir.listFile(); // 遍历特定的目录fileinfo,返回迭代器对象 118 // let fileIterator = rootInfo.scanFile(filter02); // 过滤特定的目录fileinfo,返回迭代器对象 119 if (!fileIterator) { 120 console.error("listFile interface returns an undefined object"); 121 } 122 while (!isDone02) { 123 let result: boolean = fileIterator.next(); 124 console.info("next result = " + JSON.stringify(result)); 125 isDone02 = result.done; 126 if (!isDone02) 127 subFileInfos.push(result.value); 128 } 129 } catch (err) { 130 let error: BusinessError = err as BusinessError; 131 console.error("listFile failed, errCode:" + error.code + ", errMessage:" + error.message); 132 } 133 ``` 134 1355. 操作文件或目录。 136 开发者可以集成文件访问框架的接口,完成一些用户行为,比如删除文件(目录)、重命名文件(目录)、新建文件(目录)、移动文件(目录)等。以下示例展示了如何创建一个文件,其他接口请参见[API参考](../reference/apis/js-apis-fileAccess.md)。 137 138 ```ts 139 import { BusinessError } from '@ohos.base'; 140 141 // 以本地设备为例 142 // 创建文件 143 // 示例代码sourceUri是Download目录的fileinfo中的URI 144 // 开发者应根据自己实际获取fileinfo的URI进行开发 145 async function creatFile(): Promise<void> { 146 let sourceUri: string = "file://docs/storage/Users/currentUser/Download"; 147 let displayName: string = "file1"; 148 let fileUri: string = ''; 149 try { 150 // fileAccessHelperAllServer 参考 fileAccess.createFileAccessHelper 示例代码获取 151 fileUri = await fileAccessHelperAllServer.createFile(sourceUri, displayName); 152 if (!fileUri) { 153 console.error("createFile return undefined object"); 154 } 155 console.info("createFile sucess, fileUri: " + JSON.stringify(fileUri)); 156 } catch (err) { 157 let error: BusinessError = err as BusinessError; 158 console.error("createFile failed, errCode:" + error.code + ", errMessage:" + error.message); 159 }; 160 } 161 ``` 162