1# 应用文件访问 2 3应用需要对应用文件目录下的应用文件进行查看、创建、读写、删除、移动、复制、获取属性等访问操作,下文介绍具体方法。 4 5## 接口说明 6 7开发者通过基础文件操作接口([ohos.file.fs](../reference/apis/js-apis-file-fs.md))实现应用文件访问能力,主要功能如下表所示。 8 9**表1** 基础文件操作接口功能 10 11| 接口名 | 功能 | 接口类型 | 支持同步 | 支持异步 | 12| -------- | -------- | -------- | -------- | -------- | 13| access | 检查文件是否存在 | 方法 | √ | √ | 14| close | 关闭文件 | 方法 | √ | √ | 15| copyFile | 复制文件 | 方法 | √ | √ | 16| createStream | 基于文件路径打开文件流 | 方法 | √ | √ | 17| listFile | 列出文件夹下所有文件名 | 方法 | √ | √ | 18| mkdir | 创建目录 | 方法 | √ | √ | 19| moveFile | 移动文件 | 方法 | √ | √ | 20| open | 打开文件 | 方法 | √ | √ | 21| read | 从文件读取数据 | 方法 | √ | √ | 22| rename | 重命名文件或文件夹 | 方法 | √ | √ | 23| rmdir | 删除整个目录 | 方法 | √ | √ | 24| stat | 获取文件详细属性信息 | 方法 | √ | √ | 25| unlink | 删除单个文件 | 方法 | √ | √ | 26| write | 将数据写入文件 | 方法 | √ | √ | 27| Stream.close | 关闭文件流 | 方法 | √ | √ | 28| Stream.flush | 刷新文件流 | 方法 | √ | √ | 29| Stream.write | 将数据写入流文件 | 方法 | √ | √ | 30| Stream.read | 从流文件读取数据 | 方法 | √ | √ | 31| File.fd | 获取文件描述符 | 属性 | - | - | 32| OpenMode | 设置文件打开标签 | 属性 | - | - | 33| Filter | 设置文件过滤配置项 | 类型 | - | - | 34 35## 开发示例 36 37在对应用文件开始访问前,开发者需要[获取应用文件路径](../application-models/application-context-stage.md#获取应用文件路径)。以从UIAbilityContext获取HAP级别的文件路径为例进行说明,UIAbilityContext的获取方式请参见[获取UIAbility的上下文信息](../application-models/uiability-usage.md#获取uiability的上下文信息)。 38 39下面介绍几种常用操作示例。 40 41### 新建并读写一个文件 42 43以下示例代码演示了如何新建一个文件并对其读写。 44 45```ts 46// pages/xxx.ets 47import fs from '@ohos.file.fs'; 48import common from '@ohos.app.ability.common'; 49import buffer from '@ohos.buffer'; 50 51// 获取应用文件路径 52let context = getContext(this) as common.UIAbilityContext; 53let filesDir = context.filesDir; 54 55function createFile(): void { 56 // 新建并打开文件 57 let file = fs.openSync(filesDir + '/test.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); 58 // 写入一段内容至文件 59 let writeLen = fs.writeSync(file.fd, "Try to write str."); 60 console.info("The length of str is: " + writeLen); 61 // 从文件读取一段内容 62 let arrayBuffer = new ArrayBuffer(1024); 63 class Option { 64 public offset: number = 0; 65 public length: number = 0; 66 } 67 let option = new Option(); 68 option.length = arrayBuffer.byteLength; 69 let readLen = fs.readSync(file.fd, arrayBuffer, option); 70 let buf = buffer.from(arrayBuffer, 0, readLen); 71 console.info("the content of file: " + buf.toString()); 72 // 关闭文件 73 fs.closeSync(file); 74} 75``` 76 77### 读取文件内容并写入到另一个文件 78 79以下示例代码演示了如何从一个文件读写内容到另一个文件。 80 81```ts 82// pages/xxx.ets 83import fs from '@ohos.file.fs'; 84import common from '@ohos.app.ability.common'; 85 86// 获取应用文件路径 87let context = getContext(this) as common.UIAbilityContext; 88let filesDir = context.filesDir; 89 90function readWriteFile(): void { 91 // 打开文件 92 let srcFile = fs.openSync(filesDir + '/test.txt', fs.OpenMode.READ_WRITE); 93 let destFile = fs.openSync(filesDir + '/destFile.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); 94 // 读取源文件内容并写入至目的文件 95 let bufSize = 4096; 96 let readSize = 0; 97 let buf = new ArrayBuffer(bufSize); 98 class Option { 99 public offset: number = 0; 100 public length: number = bufSize; 101 } 102 let option = new Option(); 103 option.offset = readSize; 104 let readLen = fs.readSync(srcFile.fd, buf, option); 105 while (readLen > 0) { 106 readSize += readLen; 107 fs.writeSync(destFile.fd, buf); 108 option.offset = readSize; 109 readLen = fs.readSync(srcFile.fd, buf, option); 110 } 111 // 关闭文件 112 fs.closeSync(srcFile); 113 fs.closeSync(destFile); 114} 115``` 116 117> **说明:** 118> 119> 使用读写接口时,需注意可选项参数offset的设置。对于已存在且读写过的文件,文件偏移指针默认在上次读写操作的终止位置。 120 121### 以流的形式读写文件 122 123以下示例代码演示了如何使用流接口进行文件读写: 124 125```ts 126// pages/xxx.ets 127import fs from '@ohos.file.fs'; 128import common from '@ohos.app.ability.common'; 129 130// 获取应用文件路径 131let context = getContext(this) as common.UIAbilityContext; 132let filesDir = context.filesDir; 133 134async function readWriteFileWithStream(): Promise<void> { 135 // 打开文件流 136 let inputStream = fs.createStreamSync(filesDir + '/test.txt', 'r+'); 137 let outputStream = fs.createStreamSync(filesDir + '/destFile.txt', "w+"); 138 // 以流的形式读取源文件内容并写入目的文件 139 let bufSize = 4096; 140 let readSize = 0; 141 let buf = new ArrayBuffer(bufSize); 142 class Option { 143 public offset: number = 0; 144 public length: number = bufSize; 145 } 146 let option = new Option(); 147 option.offset = readSize; 148 let readLen = await inputStream.read(buf, option); 149 readSize += readLen; 150 while (readLen > 0) { 151 await outputStream.write(buf); 152 option.offset = readSize; 153 readLen = await inputStream.read(buf, option); 154 readSize += readLen; 155 } 156 // 关闭文件流 157 inputStream.closeSync(); 158 outputStream.closeSync(); 159} 160``` 161 162> **说明:** 163> 164> 使用流接口时,需注意流的及时关闭。同时流的异步接口应严格遵循异步接口使用规范,避免同步、异步接口混用。流接口不支持并发读写。 165 166### 查看文件列表 167 168以下示例代码演示了如何查看文件列表: 169 170```ts 171import fs, { Filter } from '@ohos.file.fs'; 172import common from '@ohos.app.ability.common'; 173 174// 获取应用文件路径 175let context = getContext(this) as common.UIAbilityContext; 176let filesDir = context.filesDir; 177 178// 查看文件列表 179function getListFile(): void { 180 class ListFileOption { 181 public recursion: boolean = false; 182 public listNum: number = 0; 183 public filter: Filter = {}; 184 } 185 let option = new ListFileOption(); 186 option.filter.suffix = ['.png', '.jpg', '.txt']; // 匹配文件后缀名为'.png','.jpg','.txt' 187 option.filter.displayName = ['test*']; // 匹配文件全名以'test'开头 188 option.filter.fileSizeOver = 0; // 匹配文件大小大于等于0 189 option.filter.lastModifiedAfter = new Date(0).getTime(); // 匹配文件最近修改时间在1970年1月1日之后 190 let files = fs.listFileSync(filesDir, option); 191 for (let i = 0; i < files.length; i++) { 192 console.info(`The name of file: ${files[i]}`); 193 } 194} 195``` 196