dev-user-file-manager.md 6.7 KB
Newer Older
Z
zengyawen 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
# 开发用户文件管理器(仅对系统应用开放)

OpenHarmony预置了FileManager文件管理器。系统应用开发者也可以根据需要,按以下指导自行开发文件管理器。

## 接口说明

开发用户文件管理器的相关API详细介绍请参见[API参考](../reference/apis/js-apis-fileAccess.md)

## 开发步骤

1. 权限配置和导入模块。
   申请ohos.permission.FILE_ACCESS_MANAGER和ohos.permission.GET_BUNDLE_INFO_PRIVILEGED权限,配置方式请参见[访问控制授权申请](../security/accesstoken-guidelines.md)

   > **说明:**
   >
   > ohos.permission.FILE_ACCESS_MANAGER是使用文件访问框架接口的基础权限。
Z
zengyawen 已提交
17
   >
Z
zengyawen 已提交
18 19 20
   > ohos.permission.GET_BUNDLE_INFO_PRIVILEGED权限可以用于查询系统内当前支持的文件管理服务端应用信息。

2. 导入依赖模块。
Z
zengyawen 已提交
21

Z
zengyawen 已提交
22 23 24
   ```ts
   import fileAccess from '@ohos.file.fileAccess';
   import fileExtensionInfo from '@ohos.file.fileExtensionInfo';
25
   import { Filter } from '@ohos.file.fs';
26
   import common from '@ohos.app.ability.common';
Z
zengyawen 已提交
27 28 29 30 31 32 33 34
   ```

   其中fileAccess提供了文件基础操作的API,fileExtensionInfo提供了应用开发的关键结构体。

3. 查询设备列表。
   开发者可以获取当前系统所有文件管理服务端管理的设备属性,也可以获取某个文件管理服务端管理的设备属性。应用开发者可以按需过滤设备。

   在文件访问框架中,使用RootInfo用于表示设备的属性信息。以下示例可以获取所有设备的RootInfo。
Z
zengyawen 已提交
35

Z
zengyawen 已提交
36
   ```ts
37 38 39
   // 获取应用上下文
  let context = getContext(this) as common.UIAbilityContext;

Z
zengyawen 已提交
40
   // 创建连接系统内所有文件管理服务端的helper对象
41
   let fileAccessHelperAllServer: fileAccess.FileAccessHelper;
42
   function createFileAccessHelper() {
Z
zengyawen 已提交
43
     try {    // this.context是EntryAbility传过来的Context
44
       fileAccessHelperAllServer = fileAccess.createFileAccessHelper(context);
Z
zengyawen 已提交
45 46 47 48 49 50 51
       if (!fileAccessHelperAllServer) {
         console.error("createFileAccessHelper interface returns an undefined object");
       }
     } catch (error) {    
         console.error("createFileAccessHelper failed, errCode:" + error.code + ", errMessage:" + error.message);
     }
   }
52
   async function getRoots() {
53 54 55
     let rootIterator: fileAccess.RootIterator;
     let rootInfos: fileAccess.RootInfo[] = [];
     let isDone: boolean = false;
Z
zengyawen 已提交
56 57 58 59
     try {
       rootIterator = await fileAccessHelperAllServer.getRoots();
       if (!rootIterator) {
         console.error("getRoots interface returns an undefined object");
60 61
         return;
       }
Z
zengyawen 已提交
62 63 64 65 66
       while (!isDone) {
         let result = rootIterator.next();
         console.info("next result = " + JSON.stringify(result));
         isDone = result.done;
         if (!isDone)
67 68
           rootInfos.push(result.value);
       }
69 70
     } catch (err) {
       let error: BusinessError = err as BusinessError;
Z
zengyawen 已提交
71 72 73 74 75 76 77 78 79
       console.error("getRoots failed, errCode:" + error.code + ", errMessage:" + error.message);
     }
   }
   ```

4. 浏览目录。
   在文件访问框架中,使用FileInfo表示一个文件(目录)的基础信息。开发者可以使用listfile接口遍历下一级所有文件(目录)的迭代器对象;也可以通过scanfile过滤指定目录,获取满足条件的迭代器对象。

    listfile和scanfile接口当前支持RootInfo对象调用,可用于支撑遍历下一级文件或过滤整个目录树。同时,接口也支持FileInfo对象调用,用于支撑遍历下一级文件或过滤指定目录。
Z
zengyawen 已提交
80

Z
zengyawen 已提交
81 82
   ```ts
   // 从根目录开始
83 84 85 86
   let rootInfo = rootInfos[0];
   let fileInfos: fileAccess.FileInfo[] = [];
   let isDone: boolean = false;
   let filter: Filter = {suffix : [".txt", ".jpg", ".xlsx"]}; // 设定过滤条件
Z
zengyawen 已提交
87 88 89 90 91 92 93 94 95 96 97 98 99 100
   try {  
     let fileIterator = rootInfo.listFile();          // 遍历设备rootinfos[0]的根目录,返回迭代器对象
     // let fileIterator = rootInfo.scanFile(filter); // 过滤设备rootinfos[0]满足指定条件的文件信息,返回迭代对象
     if (!fileIterator) {
       console.error("listFile interface returns an undefined object");
       return;  
     }
     while (!isDone) {
       let result = fileIterator.next();
       console.info("next result = " + JSON.stringify(result));
       isDone = result.done;
       if (!isDone)
         fileInfos.push(result.value);
     }
101 102
   } catch (err) {
    let error: BusinessError = err as BusinessError;
Z
zengyawen 已提交
103 104 105 106 107
     console.error("listFile failed, errCode:" + error.code + ", errMessage:" + error.message);
   }
   
   // 从指定的目录开始
   let fileInfoDir = fileInfos[0]; // fileInfoDir 表示某个目录信息
108 109 110
   let subFileInfos: fileAccess.FileInfo[] = [];
   let isDone: boolean = false;
   let filter: Filter = {suffix : [".txt", ".jpg", ".xlsx"]}; // 设定过滤条件
Z
zengyawen 已提交
111 112 113 114 115 116 117 118 119 120 121 122
   try {
     let fileIterator = fileInfoDir.listFile(); // 遍历特定的目录fileinfo,返回迭代器对象
     // let fileIterator = rootInfo.scanFile(filter); // 过滤特定的目录fileinfo,返回迭代器对象
     if (!fileIterator) {
       console.error("listFile interface returns an undefined object");
       return;
     }
     while (!isDone) {
       let result = fileIterator.next();
       console.info("next result = " + JSON.stringify(result));
       isDone = result.done;
       if (!isDone)
123
         subFileInfos.push(result.value);
Z
zengyawen 已提交
124
     }
125 126
   } catch (err) {
    let error: BusinessError = err as BusinessError;
Z
zengyawen 已提交
127 128 129 130 131 132 133 134 135 136 137 138
     console.error("listFile failed, errCode:" + error.code + ", errMessage:" + error.message);
   }
   ```

5. 操作文件或目录。
   开发者可以集成文件访问框架的接口,完成一些用户行为,比如删除文件(目录)、重命名文件(目录)、新建文件(目录)、移动文件(目录)等。以下示例展示了如何创建一个文件,其他接口请参见[API参考](../reference/apis/js-apis-fileAccess.md)

   ```ts
   // 以本地设备为例
   // 创建文件
   // 示例代码sourceUri是Download目录的fileinfo中的URI
   // 开发者应根据自己实际获取fileinfo的URI进行开发
139 140 141
   let sourceUri: string = "file://docs/storage/Users/currentUser/Download";
   let displayName: string = "file1";
   let fileUri: string;
Z
zengyawen 已提交
142 143 144 145 146 147 148 149
   try {
     // fileAccessHelper 参考 fileAccess.createFileAccessHelper 示例代码获取
     fileUri = await fileAccessHelper.createFile(sourceUri, displayName);
     if (!fileUri) {
       console.error("createFile return undefined object");
       return;
     }
     console.info("createFile sucess, fileUri: " + JSON.stringify(fileUri));
150 151
   } catch (err) {
    let error: BusinessError = err as BusinessError;
Z
zengyawen 已提交
152 153 154
     console.error("createFile failed, errCode:" + error.code + ", errMessage:" + error.message);
   };
   ```