• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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```