1# 文件授权访问 2 3提供给应用的文件授权访问场景主要分为: 41.权限申明授权方式获取公共目录访问权限。 52.通过FilePicker选择文件或目录授权并支持授权持久化。 63.通过接口获取文件或文件夹当前所在路径的URI。 74.通过接口获取公共目录、外卡目录的能力。 8 9文件授权访问的场景仅支持部分设备。 10 11下面介绍几种常用操作示例。 12 13## 通过授权的方式申请Download目录权限并获取路径 14 151. 配置Download目录授权权限。 16 17 ```json 18 “requestPermissions” : [ 19 "name": "ohos.permission.READ_WRITE_DOWNLOAD_DIRECTORY" 20 ] 21 ``` 22 232. 应用获取公共Download目录后可以访问操作目录,通过获取目录环境能力接口([ohos.file.environment](../reference/apis-core-file-kit/js-apis-file-environment.md))获取环境路径。 24 25 ```ts 26 import { BusinessError } from '@ohos.base'; 27 import environment from '@ohos.file.environment'; 28 import fs from '@ohos.file.fs'; 29 30 async function getUserDownloadDirExample() { 31 try { 32 let path = environment.getUserDownloadDir(); 33 console.log(`success to getUserDownloadDir: ${JSON.stringify(path)}`); 34 await fs.mkdir(path + "/brower"); 35 let fd = await fs.open(path + "/brower/1.txt", fs.OpenMode.CREATE); 36 await fs.close(fd); 37 } catch (error) { 38 let err: BusinessError = error as BusinessError; 39 console.error(`failed to getUserDownloadDir because: ${JSON.stringify(err)}`); 40 } 41 } 42 ``` 43 44## 通过FilePicker设置永久授权 45 46通过FilePicker选择文件或文件夹后设置永久授权,以及应用重启后的激活权限过程如下所示,通过文件分享接口([ohos.fileshare](../reference/apis-core-file-kit/js-apis-fileShare.md))实现文件授权能力。 47 481. 应用调用picker的select接口,通过FilePicker选择和保存路径URI,此时应用获得该路径的临时访问权限。 49 50 以下示例代码演示了获取文件夹URI的过程: 51 52 ```ts 53 import { BusinessError } from '@ohos.base'; 54 import picker from '@ohos.file.picker'; 55 56 async function selectExample() { 57 try { 58 let DocumentSelectOptions = new picker.DocumentSelectOptions(); 59 DocumentSelectOptions.selectMode = picker.DocumentSelectMode.FOLDER; 60 let documentPicker = new picker.DocumentViewPicker(); 61 let uris = await documentPicker.select(DocumentSelectOptions); 62 } catch (error) { 63 let err: BusinessError = error as BusinessError; 64 console.error('select failed with err: ' + JSON.stringify(err)); 65 } 66 } 67 ``` 68 692. 应用按需对路径设置持久化授权,参数uri为第一步FilePicker应用获取的选择路径。 70 71 以下示例代码演示了持久化授权过程: 72 73 ```ts 74 import { BusinessError } from '@ohos.base'; 75 import fileshare from '@ohos.fileshare'; 76 import fs from '@ohos.file.fs'; 77 78 async function persistPermissionExample() { 79 try { 80 let uri = "file://docs/storage/Users/username/1.txt"; 81 let policyInfo: fileshare.PolicyInfo = { 82 uri: uri, 83 operationMode: fileshare.OperationMode.READ_MODE, 84 }; 85 let policies: Array<fileshare.PolicyInfo> = [policyInfo]; 86 fileshare.persistPermission(policies).then(() => { 87 console.info("persistPermission successfully"); 88 }).catch((err: BusinessError<Array<fileshare.PolicyErrorResult>>) => { 89 console.info("persistPermission failed with error message: " + err.message + ", error code: " + err.code); 90 if (err.code == 13900001) { 91 console.log("error data : " + JSON.stringify(err.data)); 92 } 93 }); 94 let fd = await fs.open(uri); 95 await fs.close(fd); 96 } catch (error) { 97 let err: BusinessError = error as BusinessError; 98 console.error('persistPermission failed with err: ' + JSON.stringify(err)); 99 } 100 } 101 ``` 102 1033. 应用按需对持久化授权后的路径取消授权,参数URI为第一步通过FilePicker选择的路径。 104 105 以下示例代码演示了去除持久化授权URI的过程: 106 107 ```ts 108 import { BusinessError } from '@ohos.base'; 109 import fileshare from '@ohos.fileshare'; 110 import fs from '@ohos.file.fs'; 111 112 async function revokePermissionExample() { 113 try { 114 let uri = "file://docs/storage/Users/username/1.txt"; 115 let policyInfo: fileshare.PolicyInfo = { 116 uri: uri, 117 operationMode: fileshare.OperationMode.READ_MODE, 118 }; 119 let policies: Array<fileshare.PolicyInfo> = [policyInfo]; 120 fileshare.revokePermission(policies).then(() => { 121 console.info("revokePermission successfully"); 122 }).catch((err: BusinessError<Array<fileshare.PolicyErrorResult>>) => { 123 console.info("revokePermission failed with error message: " + err.message + ", error code: " + err.code); 124 if (err.code == 13900001) { 125 console.log("error data : " + JSON.stringify(err.data)); 126 } 127 }); 128 let fd = await fs.open(uri); 129 await fs.close(fd); 130 } catch (error) { 131 let err: BusinessError = error as BusinessError; 132 console.error('revokePermission failed with err: ' + JSON.stringify(err)); 133 } 134 } 135 ``` 136 1374. 应用支持的持久化能力需要在重启时激活已经持久化授权URI,持久化授权的接口需要与激活持久化权限的接口配套使用。 138 139 以下示例代码演示了应用重启时激活持久化授权的URI,其中参数URI为应用重启后读取的最近使用文件: 140 141 ```ts 142 import { BusinessError } from '@ohos.base'; 143 import fileshare from '@ohos.fileshare'; 144 import fs from '@ohos.file.fs'; 145 146 async function activatePermissionExample01() { 147 try { 148 let uri = "file://docs/storage/Users/username/tmp.txt"; 149 let policyInfo: fileshare.PolicyInfo = { 150 uri: uri, 151 operationMode: fileshare.OperationMode.READ_MODE, 152 }; 153 let policies: Array<fileshare.PolicyInfo> = [policyInfo]; 154 fileshare.activatePermission(policies).then(() => { 155 console.info("activatePermission successfully"); 156 }).catch((err: BusinessError<Array<fileshare.PolicyErrorResult>>) => { 157 console.info("activatePermission failed with error message: " + err.message + ", error code: " + err.code); 158 }); 159 let fd = await fs.open(uri); 160 await fs.close(fd); 161 } catch (error) { 162 let err: BusinessError = error as BusinessError; 163 console.error('activatePermission failed with err: ' + JSON.stringify(err)); 164 } 165 } 166 ``` 167 1685. 应用可以按需取消激活的持久化权限能力,参数URI为应用重启后读取的最近使用文件。 169 170 以下示例代码演示了取消激活持久化权限的过程: 171 172 ```ts 173 import { BusinessError } from '@ohos.base'; 174 import fileshare from '@ohos.fileshare'; 175 import fs from '@ohos.file.fs'; 176 177 async function deactivatePermissionExample01() { 178 try { 179 let uri = "file://docs/storage/Users/username/tmp.txt"; 180 let policyInfo: fileshare.PolicyInfo = { 181 uri: uri, 182 operationMode: fileshare.OperationMode.READ_MODE, 183 }; 184 let policies: Array<fileshare.PolicyInfo> = [policyInfo]; 185 fileshare.deactivatePermission(policies).then(() => { 186 console.info("deactivatePermission successfully"); 187 }).catch((err: BusinessError<Array<fileshare.PolicyErrorResult>>) => { 188 console.info("deactivatePermission failed with error message: " + err.message + ", error code: " + err.code); 189 }); 190 let fd = await fs.open(uri); 191 await fs.close(fd); 192 } catch (error) { 193 let err: BusinessError = error as BusinessError; 194 console.error('deactivatePermission failed with err: ' + JSON.stringify(err)); 195 } 196 } 197 ``` 198 199## 获取文件或文件夹当前所在路径的URI 200 201如果当前FileUri指向文件,将返回文件所在路径URI,如果当前FileUri指向目录,将返回当前路径URI。通过文件URI接口([ohos.file.fileuri](../reference/apis-core-file-kit/js-apis-file-fileuri.md))获取文件或文件夹当前所在路径的URI。 202 203以下示例代码演示了获取文件父目录过程: 204 205```ts 206import { BusinessError } from '@ohos.base'; 207import fileUri from '@ohos.file.fileuri'; 208 209function getFullDirectoryUriExample01() { 210 try { 211 let uri = "file://docs/storage/Users/100/tmp/1.txt"; 212 let fileObject = new fileUri.FileUri(uri); 213 let directoryUri = fileObject.getFullDirectoryUri(); 214 } catch (error) { 215 let err: BusinessError = error as BusinessError; 216 console.error('getFullDirectoryUri failed with err: ' + JSON.stringify(err)); 217 } 218} 219``` 220 221## 获取公共目录、外卡目录、内卡目录 222 223应用可以获得公共目录中的下载目录、桌面目录和文档目录,但获取外卡根目录和当前用户下应用沙箱路径的内卡目录仅对文件管理器应用开放,通过获取目录环境能力接口([ohos.file.environment](../reference/apis-core-file-kit/js-apis-file-environment.md))获取环境路径。 224 225以下示例代码演示了文件管理器通过接口获取公共目录、外卡目录: 226 227```ts 228import { BusinessError } from '@ohos.base'; 229import environment from '@ohos.file.environment'; 230 231function getDirectoryExample01() { 232 try { 233 //获取公共下载目录 234 let downloadPath = environment.getUserDownloadDir(); 235 //获取公共桌面目录 236 let desktopPath = environment.getUserDesktopDir(); 237 //获取公共文档目录 238 let documentPath = environment.getUserDocumentDir(); 239 //获取外卡根目录 240 let externalStoragePath = environment.getExternalStorageDir(); 241 //获取当前用户下应用沙箱路径的内卡目录 242 let userHomePath = environment.getUserHomeDir(); 243 } catch (error) { 244 let err: BusinessError = error as BusinessError; 245 console.error('getDirectory failed with err: ' + JSON.stringify(err)); 246 } 247} 248```