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