1# 开发用户文件管理器(仅对系统应用开放) 2 3OpenHarmony预置了FileManager文件管理器。系统应用开发者也可以根据需要,按以下指导自行开发文件管理器。 4 5## 开发步骤 6开发用户文件管理器的相关API详细介绍请参见[API参考](../reference/apis-core-file-kit/js-apis-fileAccess-sys.md)。 7 81. 权限配置和导入模块。 9 申请ohos.permission.FILE_ACCESS_MANAGER和ohos.permission.GET_BUNDLE_INFO_PRIVILEGED权限,配置方式请参见[申请应用权限](../security/AccessToken/determine-application-mode.md#system_basic等级的应用申请权限)。 10 11 > **说明:** 12 > 13 > ohos.permission.FILE_ACCESS_MANAGER是使用文件访问框架接口的基础权限。 14 > 15 > ohos.permission.GET_BUNDLE_INFO_PRIVILEGED权限可以用于查询系统内当前支持的文件管理服务端应用信息。 16 172. 导入依赖模块。 18 19 ```ts 20 import fileAccess from '@ohos.file.fileAccess'; 21 import fileExtensionInfo from '@ohos.file.fileExtensionInfo'; 22 ``` 23 24 其中fileAccess提供了文件基础操作的API,fileExtensionInfo提供了应用开发的关键结构体。 25 263. 查询设备列表。 27 开发者可以获取当前系统所有文件管理服务端管理的设备属性,也可以获取某个文件管理服务端管理的设备属性。应用开发者可以按需过滤设备。 28 29 在文件访问框架中,使用RootInfo用于表示设备的属性信息。以下示例可以获取所有设备的RootInfo。 30 31 ```ts 32 import common from '@ohos.app.ability.common'; 33 import { BusinessError } from '@ohos.base'; 34 import { Filter } from '@ohos.file.fs'; 35 36 // 获取应用上下文 37 let context = getContext(this) as common.UIAbilityContext; 38 39 // 创建连接系统内所有文件管理服务端的helper对象 40 let fileAccessHelperAllServer: fileAccess.FileAccessHelper; 41 function createFileAccessHelper(): void { 42 try { // this.context是EntryAbility传过来的Context 43 fileAccessHelperAllServer = fileAccess.createFileAccessHelper(context); 44 if (!fileAccessHelperAllServer) { 45 console.error("createFileAccessHelper interface returns an undefined object"); 46 } 47 } catch (err) { 48 let error: BusinessError = err as BusinessError; 49 console.error("createFileAccessHelper failed, errCode:" + error.code + ", errMessage:" + error.message); 50 } 51 } 52 let rootInfos: Array<fileAccess.RootInfo> = []; 53 async function getRoots(): Promise<void>{ 54 let rootIterator: fileAccess.RootIterator; 55 let isDone: boolean = false; 56 try { 57 rootIterator = await fileAccessHelperAllServer.getRoots(); 58 if (!rootIterator) { 59 console.error("getRoots interface returns an undefined object"); 60 return; 61 } 62 while (!isDone) { 63 let result = rootIterator.next(); 64 console.info("next result = " + JSON.stringify(result)); 65 isDone = result.done; 66 if (!isDone) 67 rootInfos.push(result.value); 68 } 69 } catch (err) { 70 let error: BusinessError = err as BusinessError; 71 console.error("getRoots failed, errCode:" + error.code + ", errMessage:" + error.message); 72 } 73 } 74 ``` 75 764. 浏览目录。 77 在文件访问框架中,使用FileInfo表示一个文件(目录)的基础信息。开发者可以使用listfile接口遍历下一级所有文件(目录)的迭代器对象;也可以通过scanfile过滤指定目录,获取满足条件的迭代器对象。 78 79 listfile和scanfile接口当前支持RootInfo对象调用,可用于支撑遍历下一级文件或过滤整个目录树。同时,接口也支持FileInfo对象调用,用于支撑遍历下一级文件或过滤指定目录。 80 81 ```ts 82 import { BusinessError } from '@ohos.base'; 83 import { Filter } from '@ohos.file.fs'; 84 85 // 从根目录开始 86 let rootInfo: Array<fileAccess.RootInfo> = rootInfos[0]; 87 let fileInfos: Array<fileAccess.FileInfo> = []; 88 let isDone: boolean = false; 89 let filter: Filter = {suffix : [".txt", ".jpg", ".xlsx"]}; // 设定过滤条件 90 try { 91 let fileIterator: string = rootInfo.listFile(); // 遍历设备rootinfos[0]的根目录,返回迭代器对象 92 // let fileIterator = rootInfo.scanFile(filter); // 过滤设备rootinfos[0]满足指定条件的文件信息,返回迭代对象 93 if (!fileIterator) { 94 console.error("listFile interface returns an undefined object"); 95 } 96 while (!isDone) { 97 let result: boolean = fileIterator.next(); 98 console.info("next result = " + JSON.stringify(result)); 99 isDone = result.done; 100 if (!isDone) 101 fileInfos.push(result.value); 102 } 103 } catch (err) { 104 let error: BusinessError = err as BusinessError; 105 console.error("listFile failed, errCode:" + error.code + ", errMessage:" + error.message); 106 } 107 108 // 从指定的目录开始 109 let fileInfoDir: Array<fileAccess.FileInfo> = fileInfos[0]; // fileInfoDir 表示某个目录信息 110 let subFileInfos: Array<fileAccess.FileInfo> = []; 111 let isDone02: boolean = false; 112 let filter02: Filter = {suffix : [".txt", ".jpg", ".xlsx"]}; // 设定过滤条件 113 try { 114 let fileIterator: string = fileInfoDir.listFile(); // 遍历特定的目录fileinfo,返回迭代器对象 115 // let fileIterator = rootInfo.scanFile(filter02); // 过滤特定的目录fileinfo,返回迭代器对象 116 if (!fileIterator) { 117 console.error("listFile interface returns an undefined object"); 118 } 119 while (!isDone02) { 120 let result: boolean = fileIterator.next(); 121 console.info("next result = " + JSON.stringify(result)); 122 isDone02 = result.done; 123 if (!isDone02) 124 subFileInfos.push(result.value); 125 } 126 } catch (err) { 127 let error: BusinessError = err as BusinessError; 128 console.error("listFile failed, errCode:" + error.code + ", errMessage:" + error.message); 129 } 130 ``` 131 1325. 操作文件或目录。 133 开发者可以集成文件访问框架的接口,完成一些用户行为,比如删除文件(目录)、重命名文件(目录)、新建文件(目录)、移动文件(目录)等。以下示例展示了如何创建一个文件,其他接口请参见[API参考](../reference/apis-core-file-kit/js-apis-fileAccess-sys.md)。 134 135 ```ts 136 import { BusinessError } from '@ohos.base'; 137 138 // 以本地设备为例 139 // 创建文件 140 // 示例代码sourceUri是Download目录的fileinfo中的URI 141 // 开发者应根据自己实际获取fileinfo的URI进行开发 142 async function creatFile(): Promise<void> { 143 let sourceUri: string = "file://docs/storage/Users/currentUser/Download"; 144 let displayName: string = "file1"; 145 let fileUri: string = ''; 146 try { 147 // fileAccessHelperAllServer 参考 fileAccess.createFileAccessHelper 示例代码获取 148 fileUri = await fileAccessHelperAllServer.createFile(sourceUri, displayName); 149 if (!fileUri) { 150 console.error("createFile return undefined object"); 151 } 152 console.info("createFile sucess, fileUri: " + JSON.stringify(fileUri)); 153 } catch (err) { 154 let error: BusinessError = err as BusinessError; 155 console.error("createFile failed, errCode:" + error.code + ", errMessage:" + error.message); 156 }; 157 } 158 ``` 159 160## 监听设备上下线 161 162开发设备上下线的相关API详细介绍请参见[API参考](../reference/apis-core-file-kit/js-apis-fileAccess-sys.md)。 163 164notify接口不仅可以用来监听目录的变化,还能监听设备上线,下线功能。 165 166 1671. 权限配置和导入模块。 168 169 申请ohos.permission.FILE_ACCESS_MANAGER和ohos.permission.GET_BUNDLE_INFO_PRIVILEGED权限,配置方式请参见[访问控制授权申请](../security/AccessToken/declare-permissions.md)。 170 171 > **说明:** 172 > 173 > ohos.permission.FILE_ACCESS_MANAGER是使用文件访问框架接口的基础权限。 174 > 175 > ohos.permission.GET_BUNDLE_INFO_PRIVILEGED权限可以用于查询系统内当前支持的文件管理服务端应用信息。 176 1772. 导入依赖模块。 178 179 ```ts 180 import fileAccess from '@ohos.file.fileAccess'; 181 import fileExtensionInfo from '@ohos.file.fileExtensionInfo'; 182 ``` 183 184 其中fileAccess提供了文件基础操作的API,fileExtensionInfo提供了应用开发的关键结构体。 185 1863. 提供监听回调方法 187 188 ```ts 189 const callbackDir1 = (NotifyMessageDir: fileAccess.NotifyMessage) => { 190 if (NotifyMessageDir != undefined) { 191 console.log('NotifyType: ' + NotifyMessageDir.type + 'NotifyUri:' + NotifyMessageDir.uri[0]); 192 } else { 193 console.error("NotifyMessageDir is undefined"); 194 } 195 } 196 ``` 197 1984. 注册监听设备 199 200 开发者可以根据提供的[DEVICES_URI](../reference/apis-core-file-kit/js-apis-fileAccess-sys.md#常量),传入方法中,就能监听设备上线,下线状态。 201 202 ```ts 203 import { BusinessError } from '@ohos.base'; 204 async function UnregisterObserver03() { 205 try { 206 // 监听设备的上下线 207 fileAccessHelper.registerObserver(fileAccess.DEVICES_URI, true, callbackDir1); 208 } catch (err) { 209 let error: BusinessError = err as BusinessError; 210 console.error("unregisterObserver failed, errCode:" + error.code + ", errMessage:" + error.message); 211 } 212 } 213 ``` 2145. 取消设备监听 215 216 开发者可以根据提供的[DEVICES_URI](../reference/apis-core-file-kit/js-apis-fileAccess-sys.md#常量),传入方法中,就能取消设备上线,下线状态。 217 218 ```ts 219 import { BusinessError } from '@ohos.base'; 220 try { 221 // 取消监听设备的上下线 222 fileAccessHelper.unregisterObserver(fileAccess.DEVICES_URI, callbackDir1); 223 } catch (err) { 224 let error: BusinessError = err as BusinessError; 225 console.error("unregisterObserver failed, errCode:" + error.code + ", errMessage:" + error.message); 226 } 227 ```