• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_MANAGERohos.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   // 创建连接系统内所有文件管理服务端的helper对象
36   let fileAccessHelperAllServer = null;
37   createFileAccessHelper() {
38     try {    // this.context是EntryAbility传过来的Context
39       fileAccessHelperAllServer = fileAccess.createFileAccessHelper(this.context);
40       if (!fileAccessHelperAllServer) {
41         console.error("createFileAccessHelper interface returns an undefined object");
42       }
43     } catch (error) {
44         console.error("createFileAccessHelper failed, errCode:" + error.code + ", errMessage:" + error.message);
45     }
46   }
47   async getRoots() {
48     let rootIterator = null;
49     let rootInfos = [];
50     let isDone = false;
51     try {
52       rootIterator = await fileAccessHelperAllServer.getRoots();
53       if (!rootIterator) {
54         console.error("getRoots interface returns an undefined object");
55         return;
56       }
57       while (!isDone) {
58         let result = rootIterator.next();
59         console.info("next result = " + JSON.stringify(result));
60         isDone = result.done;
61         if (!isDone)
62           rootinfos.push(result.value);
63       }
64     } catch (error) {
65       console.error("getRoots failed, errCode:" + error.code + ", errMessage:" + error.message);
66     }
67   }
68   ```
69
704. 浏览目录。
71   在文件访问框架中,使用FileInfo表示一个文件(目录)的基础信息。开发者可以使用listfile接口遍历下一级所有文件(目录)的迭代器对象;也可以通过scanfile过滤指定目录,获取满足条件的迭代器对象。
72
73    listfile和scanfile接口当前支持RootInfo对象调用,可用于支撑遍历下一级文件或过滤整个目录树。同时,接口也支持FileInfo对象调用,用于支撑遍历下一级文件或过滤指定目录。
74
75   ```ts
76   // 从根目录开始
77   let rootInfo = rootinfos[0];
78   let fileInfos = [];
79   let isDone = false;
80   let filter = {suffix : [".txt", ".jpg", ".xlsx"]}; // 设定过滤条件
81   try {
82     let fileIterator = rootInfo.listFile();          // 遍历设备rootinfos[0]的根目录,返回迭代器对象
83     // let fileIterator = rootInfo.scanFile(filter); // 过滤设备rootinfos[0]满足指定条件的文件信息,返回迭代对象
84     if (!fileIterator) {
85       console.error("listFile interface returns an undefined object");
86       return;
87     }
88     while (!isDone) {
89       let result = fileIterator.next();
90       console.info("next result = " + JSON.stringify(result));
91       isDone = result.done;
92       if (!isDone)
93         fileInfos.push(result.value);
94     }
95   } catch (error) {
96     console.error("listFile failed, errCode:" + error.code + ", errMessage:" + error.message);
97   }
98
99   // 从指定的目录开始
100   let fileInfoDir = fileInfos[0]; // fileInfoDir 表示某个目录信息
101   let subFileInfos = [];
102   let isDone = false;
103   let filter = {suffix : [".txt", ".jpg", ".xlsx"]}; // 设定过滤条件
104   try {
105     let fileIterator = fileInfoDir.listFile(); // 遍历特定的目录fileinfo,返回迭代器对象
106     // let fileIterator = rootInfo.scanFile(filter); // 过滤特定的目录fileinfo,返回迭代器对象
107     if (!fileIterator) {
108       console.error("listFile interface returns an undefined object");
109       return;
110     }
111     while (!isDone) {
112       let result = fileIterator.next();
113       console.info("next result = " + JSON.stringify(result));
114       isDone = result.done;
115       if (!isDone)
116         subfileInfos.push(result.value);
117     }
118   } catch (error) {
119     console.error("listFile failed, errCode:" + error.code + ", errMessage:" + error.message);
120   }
121   ```
122
1235. 操作文件或目录。
124   开发者可以集成文件访问框架的接口,完成一些用户行为,比如删除文件(目录)、重命名文件(目录)、新建文件(目录)、移动文件(目录)等。以下示例展示了如何创建一个文件,其他接口请参见[API参考](../reference/apis/js-apis-fileAccess.md)。
125
126   ```ts
127   // 以本地设备为例
128   // 创建文件
129   // 示例代码sourceUri是Download目录的fileinfo中的URI
130   // 开发者应根据自己实际获取fileinfo的URI进行开发
131   let sourceUri = "datashare:///media/file/6";
132   let displayName = "file1";
133   let fileUri = null;
134   try {
135     // fileAccessHelper 参考 fileAccess.createFileAccessHelper 示例代码获取
136     fileUri = await fileAccessHelper.createFile(sourceUri, displayName);
137     if (!fileUri) {
138       console.error("createFile return undefined object");
139       return;
140     }
141     console.info("createFile sucess, fileUri: " + JSON.stringify(fileUri));
142   } catch (error) {
143     console.error("createFile failed, errCode:" + error.code + ", errMessage:" + error.message);
144   };
145   ```
146