1# 分布式文件子系统<a name="ZH-CN_TOPIC_0000001101541814"></a>
2
3-   [简介](#section104mcpsimp)
4    -   [系统架构](#section110mcpsimp)
5
6-   [目录](#section113mcpsimp)
7-   [约束](#section117mcpsimp)
8-   [说明](#section125mcpsimp)
9    -   [接口说明](#section127mcpsimp)
10    -   [使用说明](#section149mcpsimp)
11
12-   [相关仓](#section178mcpsimp)
13
14## 简介<a name="section104mcpsimp"></a>
15
16分布式文件子系统当前向应用程序提供用于的 IO 的 JS 接口。其具体包括用于管理文件的基本文件接口,用于管理目录的基本目录接口,用于获取文件信息的统计接口,用于流式读写文件的流式接口,以及接收 URI 而非绝对路径的沙盒接口。
17
18### 系统架构<a name="section110mcpsimp"></a>
19
20当前分布式文件子系统仅面向应用提供本地 JS 文件接口,这些接口分别通过 FileIO 模块以及 File 模块提供。架构上,分布式文件子系统实现了自研的 LibN,其抽象了 NAPI 层接口,向分布式文件子系统提供包括基本类型系统、内存管理、通用编程模型在内的基本能力。本系统对外依赖 JS 开发框架提供将 JS 接口转换为 C++ 代码的能力,依赖用户程序框架提供应用相关目录,依赖 GLIBC Runtimes 提供 IO 能力。
21
22**图 1**  分布式文件子系统架构图<a name="fig174088216114"></a>
23![](figures/分布式文件子系统架构图.png "分布式文件子系统架构图")
24
25## 目录<a name="section113mcpsimp"></a>
26
27```
28foundation/distributeddatamgr/distributedfile
29├── figures                     # 仓库图床
30├── interfaces                  # 接口代码
31├    └── kits                   # 对外接口代码
32├── utils                       # 公共组件
33├    └── filemgmt_libhilog      # 日志组件
34├    └── filemgmt_libn          # 平台相关组件
35```
36
37## 约束<a name="section117mcpsimp"></a>
38
39本地 IO 接口
40
41-   目前仅支持 UTF-8/16 编码;
42-   目前 URI 暂不支持外部存储目录;
43
44## 说明<a name="section125mcpsimp"></a>
45
46### 接口说明<a name="section127mcpsimp"></a>
47
48当前分布式文件子系统开放本地文件目录访问接口,按照功能,其可划分为如下几种类型:
49
50**表 1**  接口类型表
51
52<a name="table99228171027"></a>
53<table><thead align="left"><tr id="row2092221715211"><th class="cellrowborder" valign="top" width="15.02%" id="mcps1.2.5.1.1"><p id="p79225171524"><a name="p79225171524"></a><a name="p79225171524"></a>接口类型</p>
54</th>
55<th class="cellrowborder" valign="top" width="32.25%" id="mcps1.2.5.1.2"><p id="p992271711216"><a name="p992271711216"></a><a name="p992271711216"></a>接口用途</p>
56</th>
57<th class="cellrowborder" valign="top" width="25.840000000000003%" id="mcps1.2.5.1.3"><p id="p29225175213"><a name="p29225175213"></a><a name="p29225175213"></a>相关模块</p>
58</th>
59<th class="cellrowborder" valign="top" width="26.889999999999997%" id="mcps1.2.5.1.4"><p id="p129221017720"><a name="p129221017720"></a><a name="p129221017720"></a>接口示例(类名.方法名)</p>
60</th>
61</tr>
62</thead>
63<tbody><tr id="row149231717327"><td class="cellrowborder" valign="top" width="15.02%" headers="mcps1.2.5.1.1 "><p id="p3923417629"><a name="p3923417629"></a><a name="p3923417629"></a>基本文件接口</p>
64</td>
65<td class="cellrowborder" valign="top" width="32.25%" headers="mcps1.2.5.1.2 "><p id="p89236171124"><a name="p89236171124"></a><a name="p89236171124"></a>需要用户提供绝对路径或文件描述符(fd),提供创建、修改及访问文件,或修改文件权限的能力</p>
66</td>
67<td class="cellrowborder" valign="top" width="25.840000000000003%" headers="mcps1.2.5.1.3 "><p id="p22011844349"><a name="p22011844349"></a><a name="p22011844349"></a>@OHOS.distributedfile.fileio</p>
68</td>
69<td class="cellrowborder" valign="top" width="26.889999999999997%" headers="mcps1.2.5.1.4 "><p id="p1784383174320"><a name="p1784383174320"></a><a name="p1784383174320"></a>accessSync</p>
70<p id="p184313310437"><a name="p184313310437"></a><a name="p184313310437"></a>chownSync</p>
71<p id="p1684318315436"><a name="p1684318315436"></a><a name="p1684318315436"></a>chmodSync</p>
72</td>
73</tr>
74<tr id="row1692320171825"><td class="cellrowborder" valign="top" width="15.02%" headers="mcps1.2.5.1.1 "><p id="p392391710219"><a name="p392391710219"></a><a name="p392391710219"></a>基本目录接口</p>
75</td>
76<td class="cellrowborder" valign="top" width="32.25%" headers="mcps1.2.5.1.2 "><p id="p109232176211"><a name="p109232176211"></a><a name="p109232176211"></a>需要用户提供绝对路径,提供读取目录及判断文件类型的能力</p>
77</td>
78<td class="cellrowborder" valign="top" width="25.840000000000003%" headers="mcps1.2.5.1.3 "><p id="p271274219410"><a name="p271274219410"></a><a name="p271274219410"></a>@OHOS.distributedfile.fileio</p>
79</td>
80<td class="cellrowborder" valign="top" width="26.889999999999997%" headers="mcps1.2.5.1.4 "><p id="p29233177216"><a name="p29233177216"></a><a name="p29233177216"></a>Dir.openDirSync</p>
81</td>
82</tr>
83<tr id="row14923171716217"><td class="cellrowborder" valign="top" width="15.02%" headers="mcps1.2.5.1.1 "><p id="p159234176215"><a name="p159234176215"></a><a name="p159234176215"></a>基本Stat接口</p>
84</td>
85<td class="cellrowborder" valign="top" width="32.25%" headers="mcps1.2.5.1.2 "><p id="p1992314179215"><a name="p1992314179215"></a><a name="p1992314179215"></a>需要用户提供绝对路径,提供包括文件大小、访问权限、修改时间在内的基本统计信息</p>
86</td>
87<td class="cellrowborder" valign="top" width="25.840000000000003%" headers="mcps1.2.5.1.3 "><p id="p325774111413"><a name="p325774111413"></a><a name="p325774111413"></a>@OHOS.distributedfile.fileio</p>
88</td>
89<td class="cellrowborder" valign="top" width="26.889999999999997%" headers="mcps1.2.5.1.4 "><p id="p59231317420"><a name="p59231317420"></a><a name="p59231317420"></a>Stat.statSync</p>
90</td>
91</tr>
92<tr id="row692319171228"><td class="cellrowborder" valign="top" width="15.02%" headers="mcps1.2.5.1.1 "><p id="p1592318171526"><a name="p1592318171526"></a><a name="p1592318171526"></a>流式文件接口</p>
93</td>
94<td class="cellrowborder" valign="top" width="32.25%" headers="mcps1.2.5.1.2 "><p id="p992311171421"><a name="p992311171421"></a><a name="p992311171421"></a>需要用户提供绝对路径或文件描述符,提供流式读写文件的能力</p>
95</td>
96<td class="cellrowborder" valign="top" width="25.840000000000003%" headers="mcps1.2.5.1.3 "><p id="p1692321716217"><a name="p1692321716217"></a><a name="p1692321716217"></a>@OHOS.distributedfile.fileio</p>
97</td>
98<td class="cellrowborder" valign="top" width="26.889999999999997%" headers="mcps1.2.5.1.4 "><p id="p10923141711215"><a name="p10923141711215"></a><a name="p10923141711215"></a>Stream.createStreamSync</p>
99<p id="p88031126184311"><a name="p88031126184311"></a><a name="p88031126184311"></a>Stream.fdopenStreamSync</p>
100</td>
101</tr>
102<tr id="row82479241516"><td class="cellrowborder" valign="top" width="15.02%" headers="mcps1.2.5.1.1 "><p id="p12923111711216"><a name="p12923111711216"></a><a name="p12923111711216"></a>沙盒文件接口</p>
103</td>
104<td class="cellrowborder" valign="top" width="32.25%" headers="mcps1.2.5.1.2 "><p id="p49237171020"><a name="p49237171020"></a><a name="p49237171020"></a>需要用户提供 URI,提供基本文件接口、基本目录接口及基本统计接口能力的子集能力,或这些能力的组合能力</p>
105</td>
106<td class="cellrowborder" valign="top" width="25.840000000000003%" headers="mcps1.2.5.1.3 "><p id="p724852418510"><a name="p724852418510"></a><a name="p724852418510"></a>@system.file</p>
107</td>
108<td class="cellrowborder" valign="top" width="26.889999999999997%" headers="mcps1.2.5.1.4 "><p id="p0390135216324"><a name="p0390135216324"></a><a name="p0390135216324"></a>move</p>
109<p id="p202016525456"><a name="p202016525456"></a><a name="p202016525456"></a>copy</p>
110<p id="p8142558194520"><a name="p8142558194520"></a><a name="p8142558194520"></a>list</p>
111</td>
112</tr>
113</tbody>
114</table>
115
116其中,沙盒文件接口所使用的 URI 具体可划分为三种类型:
117
118**表 2**  URI类型表
119
120<a name="table947391523311"></a>
121<table><thead align="left"><tr id="row84733151332"><th class="cellrowborder" valign="top" width="13.969999999999999%" id="mcps1.2.5.1.1"><p id="p32271219113313"><a name="p32271219113313"></a><a name="p32271219113313"></a>目录类型</p>
122</th>
123<th class="cellrowborder" valign="top" width="16.41%" id="mcps1.2.5.1.2"><p id="p3227191993310"><a name="p3227191993310"></a><a name="p3227191993310"></a>路径前缀</p>
124</th>
125<th class="cellrowborder" valign="top" width="22%" id="mcps1.2.5.1.3"><p id="p192277196333"><a name="p192277196333"></a><a name="p192277196333"></a>访问可见性</p>
126</th>
127<th class="cellrowborder" valign="top" width="47.620000000000005%" id="mcps1.2.5.1.4"><p id="p18227719103313"><a name="p18227719103313"></a><a name="p18227719103313"></a>说明</p>
128</th>
129</tr>
130</thead>
131<tbody><tr id="row1474161514330"><td class="cellrowborder" valign="top" width="13.969999999999999%" headers="mcps1.2.5.1.1 "><p id="p9896152614335"><a name="p9896152614335"></a><a name="p9896152614335"></a>临时目录</p>
132</td>
133<td class="cellrowborder" valign="top" width="16.41%" headers="mcps1.2.5.1.2 "><p id="p389632610335"><a name="p389632610335"></a><a name="p389632610335"></a>internal://cache/</p>
134</td>
135<td class="cellrowborder" valign="top" width="22%" headers="mcps1.2.5.1.3 "><p id="p989610267332"><a name="p989610267332"></a><a name="p989610267332"></a>仅本应用可见</p>
136</td>
137<td class="cellrowborder" valign="top" width="47.620000000000005%" headers="mcps1.2.5.1.4 "><p id="p16896726173311"><a name="p16896726173311"></a><a name="p16896726173311"></a>可读写,随时可能清除,不保证持久性。一般用作下载临时目录或缓存目录。</p>
138</td>
139</tr>
140<tr id="row194741315193312"><td class="cellrowborder" valign="top" width="13.969999999999999%" headers="mcps1.2.5.1.1 "><p id="p12896142620339"><a name="p12896142620339"></a><a name="p12896142620339"></a>应用私有目录</p>
141</td>
142<td class="cellrowborder" valign="top" width="16.41%" headers="mcps1.2.5.1.2 "><p id="p118969269332"><a name="p118969269332"></a><a name="p118969269332"></a>internal://app/</p>
143</td>
144<td class="cellrowborder" valign="top" width="22%" headers="mcps1.2.5.1.3 "><p id="p189612263333"><a name="p189612263333"></a><a name="p189612263333"></a>仅本应用可见</p>
145</td>
146<td class="cellrowborder" valign="top" width="47.620000000000005%" headers="mcps1.2.5.1.4 "><p id="p1089682623314"><a name="p1089682623314"></a><a name="p1089682623314"></a>随应用卸载删除。</p>
147</td>
148</tr>
149<tr id="row204743152331"><td class="cellrowborder" valign="top" width="13.969999999999999%" headers="mcps1.2.5.1.1 "><p id="p3896152673319"><a name="p3896152673319"></a><a name="p3896152673319"></a>外部存储</p>
150</td>
151<td class="cellrowborder" valign="top" width="16.41%" headers="mcps1.2.5.1.2 "><p id="p158961526113310"><a name="p158961526113310"></a><a name="p158961526113310"></a>internal://share/</p>
152</td>
153<td class="cellrowborder" valign="top" width="22%" headers="mcps1.2.5.1.3 "><p id="p16896326133310"><a name="p16896326133310"></a><a name="p16896326133310"></a>所有应用可见</p>
154</td>
155<td class="cellrowborder" valign="top" width="47.620000000000005%" headers="mcps1.2.5.1.4 "><p id="p5897126113313"><a name="p5897126113313"></a><a name="p5897126113313"></a>随应用卸载删除。其他应用在有相应权限的情况下可读写此目录下的文件。</p>
156</td>
157</tr>
158</tbody>
159</table>
160
161### 使用说明<a name="section149mcpsimp"></a>
162
163当前分布式文件子系统所提供的 IO 接口,按照编程模型,可划分为如下几种类型:
164
165-   同步编程模型
166
167    名称包含 Sync 的接口实现为同步模型。用户在调用这些接口的时候,将同步等待,直至执行完成,执行结果以函数返回值的形式返回。
168
169    下例以只读的方式打开一个文件流,接着试图读取其中前 4096 个字节并将之转换为 UTF-8 编码的字符串,最后关闭该文件流。
170
171    ```
172    import fileio from '@OHOS.distributedfile.fileio';
173
174    try {
175        var ss = fileio.createStreamSync("tmp", "r")
176        buf = new ArrayBuffer(4096)
177        ss.readSync(buf)
178        console.log(String.fromCharCode.apply(null, new Uint8Array(buf)))
179        ss.closeSync()
180    }
181    catch (e) {
182        console.log(e);
183    }
184    ```
185
186
187-   异步编程模型:Promise
188
189    @OHOS.distributedfile.fileio 模块中,名称不含 Sync 的接口,在不提供最后一个函数型参数 callback 的时候,即实现为 Promsie 异步模型。Promise 异步模型是 OHOS 标准异步模型之一。用户在调用这些接口的时候,接口实现将异步执行任务,同时返回一个 promise 对象,其代表异步操作的结果。在返回的结果的个数超过一个时,其以对象属性的形式返回。
190
191    下例通过 Promise 链依次完成:以只读方式打开文件流、尝试读取文件前 4096 个字节、显示读取内容的长度,最后关闭文件。
192
193    ```
194    import fileio from '@OHOS.distributedfile.fileio';
195
196    try {
197        let openedStream
198        fileio.createStream("test.txt", "r")
199            .then(function (ss) {
200                openedStream = ss;
201                return ss.read(new ArrayBuffer(4096))
202            })
203            .then(function (res) {
204                console.log(res.bytesRead);
205                console.log(String.fromCharCode.apply(null, new Uint8Array(res.buffer)))
206                return openedStream.close()
207            })
208            .then(function (undefined) {
209                console.log("Stream is closed")
210            })
211            .catch(function (e) {
212                console.log(e)
213            })
214    } catch (e) {
215        console.log(e)
216    }
217    ```
218
219
220-   异步编程模型:Callback
221
222    @OHOS.distributedfile.fileio 模块中,名字不含 Sync 的接口,在提供最后一个函数性参数 callback 的时候,即实现为 Callback 异步模型。Callback 异步模型是 OHOS 标准异步模型之一。用户在调用这些接口的时候,接口实现将异步执行任务。任务执行结果以参数的形式提供给用户注册的回调函数。这些参数的第一个是 Error 或 undefined 类型,分别表示执行出错与正常。
223
224    下例异步创建文件流,并在文件流的回调函数中异步读取文件的前 4096 字节,接着在读取文件的回调函数中异步关闭文件。
225
226    ```
227    import fileio from '@OHOS.distributedfile.fileio';
228
229    try {
230        fileio.createStream("./testdir/test_stream.txt", "r", function (err, ss) {
231            if (!err) {
232                ss.read(new ArrayBuffer(4096), {}, function (err, buf, readLen) {
233                    if (!err) {
234                        console.log('readLen: ' + readLen)
235                        console.log('data: ' + String.fromCharCode.apply(null, new Uint8Array(buf)))
236                    } else {
237                        console.log('Cannot read from the stream ' + err)
238                    }
239                    ss.close(function (err) {
240                        console.log(`Stream is ${err ? 'not' : ''}closed`)
241                    });
242                })
243            } else {
244                console.log('Cannot open the stream ' + err)
245            }
246        })
247    } catch (e) {
248        console.log(e)
249    }
250    ```
251
252
253-   异步编程模型:Legacy
254
255    @system.file 模块中的所有接口都实现为 Legacy 异步模型。用户在调用这些接口的时候,需要提供 success、fail 及 complete 三个回调。在正确提供参数的情况下,当异步任务完成后,接口会根据是否成功,分别调用 success 回调或 fail 回调,并最终调用 complete 回调。
256
257    下例异步判断 URI 所指向的文件是否存在,并相应提供三个回调用于打印判断结果。
258
259
260
261## 相关仓<a name="section178mcpsimp"></a>
262
263- [**分布式文件子系统**](https://gitee.com/openharmony/distributeddatamgr_file)
264- [分布式文件服务](https://gitee.com/openharmony/filemanagement_dfs_service)
265- [公共文件访问框架](https://gitee.com/openharmony/filemanagement_user_file_service)
266- [存储管理服务](https://gitee.com/openharmony/filemanagement_storage_service)
267- [应用文件服务](https://gitee.com/openharmony/filemanagement_app_file_service)
268
269