1# Developing a File Manager Application (for System Applications Only) 2 3OpenHarmony is prebuilt with the **FileManager** application. You can also develop your own file manager application as required. 4 5## How to Develop 6For details about the APIs used to develop a file manager, see [User File Access and Management](../reference/apis-core-file-kit/js-apis-fileAccess-sys.md). 7 81. Apply for permissions required.<br>Apply for the ohos.permission.FILE_ACCESS_MANAGER and ohos.permission.GET_BUNDLE_INFO_PRIVILEGED permissions. For details, see [Requesting Permissions for System_basic Applications](../security/AccessToken/determine-application-mode.md#requesting-permissions-for-system_basic-applications). 9 10> **NOTE** 11 > 12 > - The ohos.permission.FILE_ACCESS_MANAGER permission allows your application to use the user file access framework APIs. 13 > 14 > - The ohos.permission.GET_BUNDLE_INFO_PRIVILEGED permission allows your application to obtain information about file management server applications supported by the system. 15 162. Import dependent modules. 17 18 ```ts 19 import { fileAccess } from '@kit.CoreFileKit'; 20 import { fileExtensionInfo } from '@kit.CoreFileKit'; 21 ``` 22 23 The **fileAccess** module provides APIs for basic file operations, and the **fileExtensionInfo** module provides key structs for application development. 24 253. Query device information.<br> 26 You can obtain attributes of the devices managed by one or all file management servers in the system. You can also filter devices as required. 27 28 In the user file access framework, **RootInfo** indicates the attribute information of a device. For example, obtain **RootInfo** of all devices. 29 30 ```ts 31 import { common } from '@kit.AbilityKit'; 32 import { BusinessError } from '@kit.BasicServicesKit'; 33 import { Filter } from '@kit.CoreFileKit'; 34 35 // Obtain the application context. 36 let context = getContext(this) as common.UIAbilityContext; 37 38 // Create a helper object for connecting to all file management servers in the system. 39 let fileAccessHelperAllServer: fileAccess.FileAccessHelper; 40 function createFileAccessHelper(): void { 41 try { // this.context is the context passed from EntryAbility. 42 fileAccessHelperAllServer = fileAccess.createFileAccessHelper(context); 43 if (!fileAccessHelperAllServer) { 44 console.error("createFileAccessHelper interface returns an undefined object"); 45 } 46 } catch (err) { 47 let error: BusinessError = err as BusinessError; 48 console.error("createFileAccessHelper failed, errCode:" + error.code + ", errMessage:" + error.message); 49 } 50 } 51 let rootInfos: Array<fileAccess.RootInfo> = []; 52 async function getRoots(): Promise<void>{ 53 let rootIterator: fileAccess.RootIterator; 54 let isDone: boolean = false; 55 try { 56 rootIterator = await fileAccessHelperAllServer.getRoots(); 57 if (!rootIterator) { 58 console.error("getRoots interface returns an undefined object"); 59 return; 60 } 61 while (!isDone) { 62 let result = rootIterator.next(); 63 console.info("next result = " + JSON.stringify(result)); 64 isDone = result.done; 65 if (!isDone) 66 rootInfos.push(result.value); 67 } 68 } catch (err) { 69 let error: BusinessError = err as BusinessError; 70 console.error("getRoots failed, errCode:" + error.code + ", errMessage:" + error.message); 71 } 72 } 73 ``` 74 754. View directories.<br> 76 In the user file access framework, **FileInfo** indicates basic information about a file or folder. You can use **listfile()** to obtain a **FileIterator** object that traverses all files (folders) of the next level or use **scanfile()** to obtain a **FileIterator** object that meets the specified conditions. 77 78 Currently, **listfile()** and **scanfile()** can be called by the **RootInfo** object to traverse the next-level files or filter the entire directory tree. In addition, **listfile()** and **scanfile()** can be called by the **FileInfo** object to traverse the next-level files or filter the specified directories. 79 80 ```ts 81 import { BusinessError } from '@kit.BasicServicesKit'; 82 import { Filter } from '@kit.CoreFileKit'; 83 84 // Start from the root directory. 85 let rootInfos = []; 86 // Obtain rootInfos by using getRoots(). 87 let rootInfo: fileAccess.RootInfo = rootInfos[0]; 88 let fileInfos: Array<fileAccess.FileInfo> = []; 89 let isDone: boolean = false; 90 let filter: Filter = {suffix : [".txt", ".jpg", ".xlsx"]}; // Set the filter. 91 try { 92 let fileIterator = rootInfo.listFile(); // Traverse the root directory of rootinfos[0] and return a FileIterator object. 93 // let fileIterator = rootInfo.scanFile(filter); // Filter device rootinfos[0] files that meet the specified conditions and return a FileIterator object. 94 if (!fileIterator) { 95 console.error("listFile interface returns an undefined object"); 96 } 97 while (!isDone) { 98 let result = fileIterator.next(); 99 console.info("next result = " + JSON.stringify(result)); 100 isDone = result.done; 101 if (!isDone) 102 fileInfos.push(result.value); 103 } 104 } catch (err) { 105 let error: BusinessError = err as BusinessError; 106 console.error("listFile failed, errCode:" + error.code + ", errMessage:" + error.message); 107 } 108 109 // Start from the specified directory. 110 let fileInfoDir: fileAccess.FileInfo = fileInfos[0]; // fileInfoDir indicates the information about a directory. 111 let subFileInfos: Array<fileAccess.FileInfo> = []; 112 let isDone02: boolean = false; 113 let filter02: Filter = {suffix : [".txt", ".jpg", ".xlsx"]}; // Set the filter. 114 try { 115 let fileIterator = fileInfoDir.listFile(); // Traverse files in the specified directory and return a FileIterator object. 116 // let fileIterator = rootInfo.scanFile(filter02); // Filter the files in the specified directory and return a FileIterator object. 117 if (!fileIterator) { 118 console.error("listFile interface returns an undefined object"); 119 } 120 while (!isDone02) { 121 let result = fileIterator.next(); 122 console.info("next result = " + JSON.stringify(result)); 123 isDone02 = result.done; 124 if (!isDone02) 125 subFileInfos.push(result.value); 126 } 127 } catch (err) { 128 let error: BusinessError = err as BusinessError; 129 console.error("listFile failed, errCode:" + error.code + ", errMessage:" + error.message); 130 } 131 ``` 132 1335. Perform operations on files or folders.<br> 134 You can integrate APIs of the user file access framework to implement user behaviors, such as deleting, renaming, creating, and moving a file or folder. The following example shows how to create a file. For details about other APIs, see [User File Access and Management](../reference/apis-core-file-kit/js-apis-fileAccess-sys.md). 135 136 ```ts 137 import { BusinessError } from '@kit.BasicServicesKit'; 138 139 // The local device is used as an example. 140 // Create a file. 141 // sourceUri is the URI in fileinfo of the Download directory. 142 // You need to use the obtained URI for development. 143 async function creatFile(): Promise<void> { 144 let sourceUri: string = "file://docs/storage/Users/currentUser/Download"; 145 let displayName: string = "file1"; 146 let fileUri: string = ''; 147 try { 148 // Obtain fileAccessHelperAllServer by referring to the sample code of fileAccess.createFileAccessHelper. 149 fileUri = await fileAccessHelperAllServer.createFile(sourceUri, displayName); 150 if (!fileUri) { 151 console.error("createFile return undefined object"); 152 } 153 console.info("createFile success, fileUri: " + JSON.stringify(fileUri)); 154 } catch (err) { 155 let error: BusinessError = err as BusinessError; 156 console.error("createFile failed, errCode:" + error.code + ", errMessage:" + error.message); 157 }; 158 } 159 ``` 160 161## Listening for Device Online/Offline Status 162 163For details about the APIs, see [User File Access and Management](../reference/apis-core-file-kit/js-apis-fileAccess-sys.md). 164 165You can use **notify()** to observe not only the changes of directories, but also the device online/offline status. 166 167 1681. Apply for permissions required.<br> 169 170 Apply for the ohos.permission.FILE_ACCESS_MANAGER and ohos.permission.GET_BUNDLE_INFO_PRIVILEGED permissions. For details, see [Declaring Permissions](../security/AccessToken/declare-permissions.md). 171 172 > **NOTE** 173 > 174 > - The ohos.permission.FILE_ACCESS_MANAGER permission allows your application to call the user file access framework APIs. 175 >- The ohos.permission.GET_BUNDLE_INFO_PRIVILEGED permission allows your application to obtain information about file management server applications supported by the system. 176 1772. Import dependent modules. 178 179 ```ts 180 import { fileAccess } from '@kit.CoreFileKit'; 181 import { fileExtensionInfo } from '@kit.CoreFileKit'; 182 ``` 183 184 The **fileAccess** module provides APIs for basic file operations, and the **fileExtensionInfo** module provides key structs for application development. 185 1863. Define an observer callback. 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. Subscribe to the device online/offline status. 199 200 Pass in the constant [DEVICES_URI](../reference/apis-core-file-kit/js-apis-fileAccess-sys.md#constant) to the **registerObserver** method to listen for the device online/offline status. 201 202 ```ts 203 import { BusinessError } from '@kit.BasicServicesKit'; 204 async function UnregisterObserver03() { 205 try { 206 // Listen for the device online/offline status. 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 ``` 214 2155. Unsubscribe from the device online/offline status. 216 217 Pass in the constant [DEVICES_URI](../reference/apis-core-file-kit/js-apis-fileAccess-sys.md#constant) to the **unregisterObserver** method to unsubscribe from the device online/offline status. 218 219 ```ts 220 import { BusinessError } from '@kit.BasicServicesKit'; 221 try { 222 // Unsubscribe from the device online/offline status. 223 fileAccessHelper.unregisterObserver(fileAccess.DEVICES_URI, callbackDir1); 224 } catch (err) { 225 let error: BusinessError = err as BusinessError; 226 console.error("unregisterObserver failed, errCode:" + error.code + ", errMessage:" + error.message); 227 } 228 ```