diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..e69de29
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..4947287
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,177 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
\ No newline at end of file
diff --git a/README.en.md b/README.en.md
deleted file mode 100644
index 0df2bc5..0000000
--- a/README.en.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# distributeddatamgr_file
-
-#### Description
-Providing JavaScript APIs for file management | 提供适用于文件管理的 JS 接口
-
-#### Software Architecture
-Software architecture description
-
-#### Installation
-
-1. xxxx
-2. xxxx
-3. xxxx
-
-#### Instructions
-
-1. xxxx
-2. xxxx
-3. xxxx
-
-#### Contribution
-
-1. Fork the repository
-2. Create Feat_xxx branch
-3. Commit your code
-4. Create Pull Request
-
-
-#### Gitee Feature
-
-1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
-2. Gitee blog [blog.gitee.com](https://blog.gitee.com)
-3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
-4. The most valuable open source project [GVP](https://gitee.com/gvp)
-5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
-6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
diff --git a/README.md b/README.md
index d46064d..55e6ee1 100644
--- a/README.md
+++ b/README.md
@@ -1,37 +1,280 @@
-# distributeddatamgr_file
+# Distributed File
-#### 介绍
-Providing JavaScript APIs for file management | 提供适用于文件管理的 JS 接口
+- [Introduction](#section104mcpsimp)
+ - [Architecture](#section110mcpsimp)
-#### 软件架构
-软件架构说明
+- [Directory Structure](#section113mcpsimp)
+- [Constraints](#section117mcpsimp)
+- [Usage](#section125mcpsimp)
+ - [Available APIs](#section127mcpsimp)
+ - [Usage Guidelines](#section149mcpsimp)
+
+- [Repositories Involved](#section178mcpsimp)
+
+## Introduction
+
+Currently, the Distributed File subsystem provides apps with JavaScript APIs for I/O capabilities, including APIs for managing files and directories, obtaining file information, reading and writing data streams of files, and receiving URIs rather than absolute paths.
+
+### Architecture
+
+Currently, the Distributed File subsystem provides only local JavaScript file APIs for apps through the FileIO and File modules. The Distributed File subsystem uses LibN to abstract APIs at the NAPI layer, providing basic capabilities such as the basic type system, memory management, and general programming models for the subsystem. This subsystem depends on the engine layer of the JS application development framework to provide the capability of converting JavaScript APIs into C++ code, depends on the application framework to provide app-related directories, and depends on the GLIBC runtimes to provide I/O capabilities.
+
+**Figure 1** Distributed File subsystem architecture
+
+
+## Directory Structure
+
+```
+foundation/distributeddatamgr/distributedfile
+└── interfaces # APIs
+ └── kits # APIs exposed externally
+```
+
+## Constraints
+
+Constraints on local I/O APIs:
+
+- Only UTF-8/16 encoding is supported.
+- The URIs cannot include external storage directories.
+
+## Usage
+
+### Available APIs
+
+Currently, the Distributed File subsystem provides APIs for accessing local files and directories. The following table describes the API types classified by function.
+
+**Table 1** API types
+
+
+
API Type
+ |
+Function
+ |
+Related Module
+ |
+Example API (Class Name.Method Name)
+ |
+
+
+Basic file API
+ |
+Creates, modifies, and accesses files, and changes file permissions based on the specified absolute paths or file descriptors.
+ |
+@OHOS.distributedfile.fileio
+ |
+accessSync
+chownSync
+chmodSync
+ |
+
+Basic directory API
+ |
+Reads directories and determines file types based on the specified absolute paths.
+ |
+@OHOS.distributedfile.fileio
+ |
+Dir.openDirSync
+ |
+
+Basic statistical API
+ |
+Collects basic statistics including the file size, access permission, and modification time based on the specified absolute paths.
+ |
+@OHOS.distributedfile.fileio
+ |
+Stat.statSync
+ |
+
+Streaming file API
+ |
+Reads and writes data streams of files based on the specified absolute paths or file descriptors.
+ |
+@OHOS.distributedfile.fileio
+ |
+Stream.createStreamSync
+Stream.fdopenStreamSync
+ |
+
+Sandbox file API
+ |
+Provides a subset or a combination of the capabilities provided by the basic file, directory, and statistical APIs based on the specified URIs.
+ |
+@system.file
+ |
+move
+copy
+list
+ |
+
+
+
+
+The URIs used in sandbox file APIs are classified into three types, as described in the following table.
+
+**Table 2** URI types
+
+
+Directory Type
+ |
+Prefix
+ |
+Access Visibility
+ |
+Description
+ |
+
+
+Temporary directory
+ |
+internal://cache/
+ |
+Current app only
+ |
+Readable and writable, and can be cleared at any time. This directory is usually used for temporary downloads or caches.
+ |
+
+Private directory of an app
+ |
+internal://app/
+ |
+Current app only
+ |
+Deleted when the app is uninstalled.
+ |
+
+External storage
+ |
+internal://share/
+ |
+All apps
+ |
+Deleted when the app is uninstalled. Other apps with granted permissions can read and write files in this directory.
+ |
+
+
+
+
+### Usage Guidelines
+
+The I/O APIs provided by the Distributed File subsystem can be classified into the following types based on the programming model:
+
+- Synchronous programming model
+
+ APIs whose names contain **Sync** are implemented as a synchronous model. When a synchronous API is called, the calling process waits until a value is returned.
+
+ The following example opens a file stream in read-only mode, attempts to read the first 4096 bytes, converts them into a UTF-8-encoded string, and then closes the file stream:
+
+ ```
+ import fileio from '@OHOS.distributedfile.fileio';
+
+ try {
+ var ss = fileio.Stream.createStreamSync("tmp", "r")
+ buf = new ArrayBuffer(4096)
+ ss.readSync(buf)
+ console.log(String.fromCharCode.apply(null, new Uint8Array(buf)))
+ ss.closeSync()
+ }
+ catch (e) {
+ console.log(e);
+ }
+ ```
-#### 安装教程
+- Asynchronous programming model: Promise
-1. xxxx
-2. xxxx
-3. xxxx
+ In the **@OHOS.distributedfile.fileio** module, the APIs whose names do not contain **Sync** and to which a callback is not passed as their input parameter are implemented as the Promise asynchronous model. The Promise asynchronous model is one of the OHOS standard asynchronous models. When an asynchronous API using the Promise model is called, the API returns a Promise object while executing the concerned task asynchronously. The Promise object represents the asynchronous operation result. When there is more than one result, the results are returned as properties of the Promise object.
-#### 使用说明
+ In the following example, a Promise chain is used to open a file stream in read-only mode, attempt to read the first 4096 bytes of the file, display the length of the content read, and then close the file:
-1. xxxx
-2. xxxx
-3. xxxx
-
-#### 参与贡献
-
-1. Fork 本仓库
-2. 新建 Feat_xxx 分支
-3. 提交代码
-4. 新建 Pull Request
+ ```
+ import fileio from '@OHOS.distributedfile.fileio';
+
+ try {
+ let openedStream
+ fileio.Stream.createStream("test.txt", "r")
+ .then(function (ss) {
+ openedStream = ss;
+ return ss.read(new ArrayBuffer(4096))
+ })
+ .then(function (res) {
+ console.log(res.bytesRead);
+ console.log(String.fromCharCode.apply(null, new Uint8Array(res.buffer)))
+ return openedStream.close()
+ })
+ .then(function (undefined) {
+ console.log("Stream is closed")
+ })
+ .catch(function (e) {
+ console.log(e)
+ })
+ } catch (e) {
+ console.log(e)
+ }
+ ```
-#### 特技
+- Asynchronous programming model: Callback
+
+ In the **@OHOS.distributedfile.fileio** module, the APIs whose names do not contain **Sync** and to which a callback is directly passed as their input parameter are implemented as the callback asynchronous model. The callback asynchronous model is also one of the OHOS standard asynchronous models. When an asynchronous API with a callback passed is called, the API executes the concerned task asynchronously and returns the execution result as the input parameters of the registered callback. The first parameter is of the **undefined** or **Error** type, indicating that the execution succeeds or fails, respectively.
+
+ The following example creates a file stream asynchronously, reads the first 4096 bytes of the file asynchronously in the callback invoked when the file stream is created, and then closes the file asynchronously in the callback invoked when the file is read:
+
+ ```
+ import fileio from '@OHOS.distributedfile.fileio';
+
+ try {
+ fileio.Stream.createStream("./testdir/test_stream.txt", "r", function (err, ss) {
+ if (!err) {
+ ss.read(new ArrayBuffer(4096), {}, function (err, buf, readLen) {
+ if (!err) {
+ console.log('readLen: ' + readLen)
+ console.log('data: ' + String.fromCharCode.apply(null, new Uint8Array(buf)))
+ } else {
+ console.log('Cannot read from the stream ' + err)
+ }
+ ss.close(function (err) {
+ console.log(`Stream is ${err ? 'not' : ''}closed`)
+ });
+ })
+ } else {
+ console.log('Cannot open the stream ' + err)
+ }
+ })
+ } catch (e) {
+ console.log(e)
+ }
+ ```
+
+
+- Asynchronous programming model: Legacy
+
+ All APIs in the **@system.file** module are implemented as the legacy asynchronous model. When calling such an API, you need to implement three callbacks \(including **success**, **fail**, and **complete**\) to be invoked when the execution is successful, fails, or is complete, respectively. If the input parameters are correct, the API calls the **success** or **fail** callback based on whether the asynchronous task is successful after the task execution is complete, and finally calls the **complete** callback.
+
+ The following example asynchronously checks whether the file pointed to by the specified URI exists and provides three callbacks to print the check result:
+
+ ```
+ import file from '@system.file'
+
+ file.access({
+ uri: 'internal://app/test.txt',
+ success: function() {
+ console.log('call access success.');
+ },
+ fail: function(data, code) {
+ console.error('call fail callback fail, code: ' + code + ', data: ' + data);
+ },
+ complete: function () {
+ console.log('call access finally.');
+ }
+ });
+
+ console.log("file access tested done")
+ ```
+
+
+## Repositories Involved
+
+**Distributed File subsystem**
+
+distributeddatamgr_distributedfile
-1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
-2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
-3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
-4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
-5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
-6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
diff --git a/README_zh.md b/README_zh.md
new file mode 100644
index 0000000..14fde27
--- /dev/null
+++ b/README_zh.md
@@ -0,0 +1,281 @@
+# 分布式文件子系统
+
+- [简介](#section104mcpsimp)
+ - [系统架构](#section110mcpsimp)
+
+- [目录结构](#section113mcpsimp)
+- [约束](#section117mcpsimp)
+- [说明](#section125mcpsimp)
+ - [接口说明](#section127mcpsimp)
+ - [使用说明](#section149mcpsimp)
+
+- [相关仓](#section178mcpsimp)
+
+## 简介
+
+分布式文件子系统当前向应用程序提供用于的 IO 的 JS 接口。其具体包括用于管理文件的基本文件接口,用于管理目录的基本目录接口,用于获取文件信息的统计接口,用于流式读写文件的流式接口,以及接收 URI 而非绝对路径的沙盒接口。
+
+### 系统架构
+
+当前分布式文件子系统仅面向应用提供本地 JS 文件接口,这些接口分别通过 FileIO 模块以及 File 模块提供。架构上,分布式文件子系统实现了自研的 LibN,其抽象了 NAPI 层接口,向分布式文件子系统提供包括基本类型系统、内存管理、通用编程模型在内的基本能力。本系统对外依赖 JS 开发框架提供将 JS 接口转换为 C++ 代码的能力,依赖用户程序框架提供应用相关目录,依赖 GLIBC Runtimes 提供 IO 能力。
+
+**图 1** 分布式文件子系统架构图
+
+
+## 目录结构
+
+```
+foundation/distributeddatamgr/distributedfile
+├── figures # 仓库图床
+└── interfaces # 接口代码
+ └── kits # 对外接口代码
+```
+
+## 约束
+
+本地 IO 接口
+
+- 目前仅支持 UTF-8/16 编码;
+- 目前 URI 暂不支持外部存储目录;
+
+## 说明
+
+### 接口说明
+
+当前分布式文件子系统开放本地文件目录访问接口,按照功能,其可划分为如下几种类型:
+
+**表 1** 接口类型表
+
+
+接口类型
+ |
+接口用途
+ |
+相关模块
+ |
+接口示例(类名.方法名)
+ |
+
+
+基本文件接口
+ |
+需要用户提供绝对路径或文件描述符(fd),提供创建、修改及访问文件,或修改文件权限的能力
+ |
+@OHOS.distributedfile.fileio
+ |
+accessSync
+chownSync
+chmodSync
+ |
+
+基本目录接口
+ |
+需要用户提供绝对路径,提供读取目录及判断文件类型的能力
+ |
+@OHOS.distributedfile.fileio
+ |
+Dir.openDirSync
+ |
+
+基本Stat接口
+ |
+需要用户提供绝对路径,提供包括文件大小、访问权限、修改时间在内的基本统计信息
+ |
+@OHOS.distributedfile.fileio
+ |
+Stat.statSync
+ |
+
+流式文件接口
+ |
+需要用户提供绝对路径或文件描述符,提供流式读写文件的能力
+ |
+@OHOS.distributedfile.fileio
+ |
+Stream.createStreamSync
+Stream.fdopenStreamSync
+ |
+
+沙盒文件接口
+ |
+需要用户提供 URI,提供基本文件接口、基本目录接口及基本统计接口能力的子集能力,或这些能力的组合能力
+ |
+@system.file
+ |
+move
+copy
+list
+ |
+
+
+
+
+其中,沙盒文件接口所使用的 URI 具体可划分为三种类型:
+
+**表 2** URI类型表
+
+
+目录类型
+ |
+路径前缀
+ |
+访问可见性
+ |
+说明
+ |
+
+
+临时目录
+ |
+internal://cache/
+ |
+仅本应用可见
+ |
+可读写,随时可能清除,不保证持久性。一般用作下载临时目录或缓存目录。
+ |
+
+应用私有目录
+ |
+internal://app/
+ |
+仅本应用可见
+ |
+随应用卸载删除。
+ |
+
+外部存储
+ |
+internal://share/
+ |
+所有应用可见
+ |
+随应用卸载删除。其他应用在有相应权限的情况下可读写此目录下的文件。
+ |
+
+
+
+
+### 使用说明
+
+当前分布式文件子系统所提供的 IO 接口,按照编程模型,可划分为如下几种类型:
+
+- 同步编程模型
+
+ 名称包含 Sync 的接口实现为同步模型。用户在调用这些接口的时候,将同步等待,直至执行完成,执行结果以函数返回值的形式返回。
+
+ 下例以只读的方式打开一个文件流,接着试图读取其中前 4096 个字节并将之转换为 UTF-8 编码的字符串,最后关闭该文件流。
+
+ ```
+ import fileio from '@OHOS.distributedfile.fileio';
+
+ try {
+ var ss = fileio.Stream.createStreamSync("tmp", "r")
+ buf = new ArrayBuffer(4096)
+ ss.readSync(buf)
+ console.log(String.fromCharCode.apply(null, new Uint8Array(buf)))
+ ss.closeSync()
+ }
+ catch (e) {
+ console.log(e);
+ }
+ ```
+
+
+- 异步编程模型:Promise
+
+ @OHOS.distributedfile.fileio 模块中,名称不含 Sync 的接口,在不提供最后一个函数型参数 callback 的时候,即实现为 Promsie 异步模型。Promise 异步模型是 OHOS 标准异步模型之一。用户在调用这些接口的时候,接口实现将异步执行任务,同时返回一个 promise 对象,其代表异步操作的结果。在返回的结果的个数超过一个时,其以对象属性的形式返回。
+
+ 下例通过 Promise 链依次完成:以只读方式打开文件流、尝试读取文件前 4096 个字节、显示读取内容的长度,最后关闭文件。
+
+ ```
+ import fileio from '@OHOS.distributedfile.fileio';
+
+ try {
+ let openedStream
+ fileio.Stream.createStream("test.txt", "r")
+ .then(function (ss) {
+ openedStream = ss;
+ return ss.read(new ArrayBuffer(4096))
+ })
+ .then(function (res) {
+ console.log(res.bytesRead);
+ console.log(String.fromCharCode.apply(null, new Uint8Array(res.buffer)))
+ return openedStream.close()
+ })
+ .then(function (undefined) {
+ console.log("Stream is closed")
+ })
+ .catch(function (e) {
+ console.log(e)
+ })
+ } catch (e) {
+ console.log(e)
+ }
+ ```
+
+
+- 异步编程模型:Callback
+
+ @OHOS.distributedfile.fileio 模块中,名字不含 Sync 的接口,在提供最后一个函数性参数 callback 的时候,即实现为 Callback 异步模型。Callback 异步模型是 OHOS 标准异步模型之一。用户在调用这些接口的时候,接口实现将异步执行任务。任务执行结果以参数的形式提供给用户注册的回调函数。这些参数的第一个是 Error 或 undefined 类型,分别表示执行出错与正常。
+
+ 下例异步创建文件流,并在文件流的回调函数中异步读取文件的前 4096 字节,接着在读取文件的回调函数中异步关闭文件。
+
+ ```
+ import fileio from '@OHOS.distributedfile.fileio';
+
+ try {
+ fileio.Stream.createStream("./testdir/test_stream.txt", "r", function (err, ss) {
+ if (!err) {
+ ss.read(new ArrayBuffer(4096), {}, function (err, buf, readLen) {
+ if (!err) {
+ console.log('readLen: ' + readLen)
+ console.log('data: ' + String.fromCharCode.apply(null, new Uint8Array(buf)))
+ } else {
+ console.log('Cannot read from the stream ' + err)
+ }
+ ss.close(function (err) {
+ console.log(`Stream is ${err ? 'not' : ''}closed`)
+ });
+ })
+ } else {
+ console.log('Cannot open the stream ' + err)
+ }
+ })
+ } catch (e) {
+ console.log(e)
+ }
+ ```
+
+
+- 异步编程模型:Legacy
+
+ @system.file 模块中的所有接口都实现为 Legacy 异步模型。用户在调用这些接口的时候,需要提供 success、fail 及 complete 三个回调。在正确提供参数的情况下,当异步任务完成后,接口会根据是否成功,分别调用 success 回调或 fail 回调,并最终调用 complete 回调。
+
+ 下例异步判断 URI 所指向的文件是否存在,并相应提供三个回调用于打印判断结果。
+
+ ```
+ import file from '@system.file'
+
+ file.access({
+ uri: 'internal://app/test.txt',
+ success: function() {
+ console.log('call access success.');
+ },
+ fail: function(data, code) {
+ console.error('call fail callback fail, code: ' + code + ', data: ' + data);
+ },
+ complete: function () {
+ console.log('call access finally.');
+ }
+ });
+
+ console.log("file access tested done")
+ ```
+
+
+## 相关仓
+
+**分布式文件**
+
+distributeddatamgr_distributedfile
+
diff --git a/figures/distributed-file-subsystem-architecture.png b/figures/distributed-file-subsystem-architecture.png
new file mode 100644
index 0000000..d36a4b1
Binary files /dev/null and b/figures/distributed-file-subsystem-architecture.png differ
diff --git a/figures/分布式文件子系统架构图.png b/figures/分布式文件子系统架构图.png
new file mode 100644
index 0000000..e3763b7
Binary files /dev/null and b/figures/分布式文件子系统架构图.png differ
diff --git a/interfaces/kits/js/BUILD.gn b/interfaces/kits/js/BUILD.gn
new file mode 100644
index 0000000..b533248
--- /dev/null
+++ b/interfaces/kits/js/BUILD.gn
@@ -0,0 +1,57 @@
+# Copyright (c) 2021 Huawei Device Co., Ltd.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build/ohos.gni")
+
+ohos_shared_library("fileio") {
+ subsystem_name = "distributeddatamgr"
+ part_name = "distributedfilejs"
+
+ relative_install_dir = "module"
+
+ include_dirs = [
+ "//third_party/node/src",
+ "//foundation/ace/napi/interfaces/kits",
+ "//utils/native/base/include",
+ ]
+
+ sources = [
+ "src/common/fd_guard.cpp",
+ "src/common/napi/n_class.cpp",
+ "src/common/napi/n_func_arg.cpp",
+ "src/common/napi/n_val.cpp",
+ "src/common/uni_error.cpp",
+ "src/mod_fileio/class_dir/dir_n_exporter.cpp",
+ "src/mod_fileio/class_dirent/dirent_n_exporter.cpp",
+ "src/mod_fileio/class_stat/stat_n_exporter.cpp",
+ "src/mod_fileio/class_stream/stream_n_exporter.cpp",
+ "src/mod_fileio/common_func.cpp",
+ "src/mod_fileio/module.cpp",
+ "src/mod_fileio/properties/prop_n_exporter.cpp",
+ ]
+
+ deps = [
+ "//foundation/ace/napi:ace_napi",
+ "//utils/native/base:utilsecurec",
+ ]
+
+ external_deps = [
+ "hiviewdfx_hilog_native:libhilog",
+ ]
+}
+
+group("build_kits_js") {
+ deps = [
+ ":fileio",
+ ]
+}
\ No newline at end of file
diff --git a/interfaces/kits/js/src/common/fd_guard.cpp b/interfaces/kits/js/src/common/fd_guard.cpp
new file mode 100644
index 0000000..fa45945
--- /dev/null
+++ b/interfaces/kits/js/src/common/fd_guard.cpp
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2021 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "fd_guard.h"
+
+#include
+
+namespace OHOS {
+namespace DistributedFS {
+FDGuard::FDGuard(int fd) : fd_(fd) {}
+
+FDGuard::~FDGuard()
+{
+ if (fd_ > 0) {
+ close(fd_);
+ }
+}
+
+int FDGuard::GetFD() const
+{
+ return fd_;
+}
+
+void FDGuard::SetFD(int fd)
+{
+ fd_ = fd;
+}
+
+void FDGuard::ClearFD()
+{
+ fd_ = -1;
+}
+} // namespace DistributedFS
+} // namespace OHOS
\ No newline at end of file
diff --git a/interfaces/kits/js/src/common/fd_guard.h b/interfaces/kits/js/src/common/fd_guard.h
new file mode 100644
index 0000000..2db7438
--- /dev/null
+++ b/interfaces/kits/js/src/common/fd_guard.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2021 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+namespace OHOS {
+namespace DistributedFS {
+class FDGuard {
+public:
+ FDGuard() = default;
+ explicit FDGuard(int fd);
+ ~FDGuard();
+
+ int GetFD() const;
+ void SetFD(int fd);
+ void ClearFD();
+
+private:
+ int fd_ = -1;
+};
+} // namespace DistributedFS
+} // namespace OHOS
diff --git a/interfaces/kits/js/src/common/log.h b/interfaces/kits/js/src/common/log.h
new file mode 100644
index 0000000..32a09a7
--- /dev/null
+++ b/interfaces/kits/js/src/common/log.h
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2021 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include
+#include
+#include
+
+#ifndef FILE_SUBSYSTEM_DEV_ON_PC
+#include "hilog/log.h"
+#endif
+
+namespace OHOS {
+namespace DistributedFS {
+#ifndef FILE_SUBSYSTEM_DEV_ON_PC
+static constexpr int FILEIO_DOMAIN_ID = 0;
+static constexpr OHOS::HiviewDFX::HiLogLabel FILEIO_LABEL = { LOG_CORE, FILEIO_DOMAIN_ID, "distributedfilejs" };
+
+#ifdef HILOGD
+#undef HILOGD
+#endif
+
+#ifdef HILOGF
+#undef HILOGF
+#endif
+
+#ifdef HILOGE
+#undef HILOGE
+#endif
+
+#ifdef HILOGW
+#undef HILOGW
+#endif
+
+#ifdef HILOGI
+#undef HILOGI
+#endif
+
+#define HILOGD(fmt, ...) \
+ (void)OHOS::HiviewDFX::HiLog::Debug(OHOS::DistributedFS::FILEIO_LABEL, "%{public}s: " fmt, __func__, ##__VA_ARGS__)
+#define HILOGI(fmt, ...) \
+ (void)OHOS::HiviewDFX::HiLog::Info(OHOS::DistributedFS::FILEIO_LABEL, "%{public}s: " fmt, __func__, ##__VA_ARGS__)
+#define HILOGW(fmt, ...) \
+ (void)OHOS::HiviewDFX::HiLog::Warn(OHOS::DistributedFS::FILEIO_LABEL, "%{public}s: " fmt, __func__, ##__VA_ARGS__)
+#define HILOGE(fmt, ...) \
+ (void)OHOS::HiviewDFX::HiLog::Error(OHOS::DistributedFS::FILEIO_LABEL, "%{public}s: " fmt, __func__, ##__VA_ARGS__)
+#define HILOGF(fmt, ...) \
+ (void)OHOS::HiviewDFX::HiLog::Fatal(OHOS::DistributedFS::FILEIO_LABEL, "%{public}s: " fmt, __func__, ##__VA_ARGS__)
+
+#else
+
+#define PCLOG(fmt, ...) \
+ do { \
+ const std::vector filter = { \
+ "{public}", \
+ "{private}", \
+ }; \
+ std::string str____(fmt); \
+ for (auto &&pattern : filter) { \
+ size_t pos = 0; \
+ while (std::string::npos != (pos = str____.find(pattern))) { \
+ str____.erase(pos, pattern.length()); \
+ } \
+ } \
+ str____ += "\n"; \
+ printf(str____.c_str(), ##__VA_ARGS__); \
+ } while (0);
+
+#define HILOGD(fmt, ...) PCLOG("%{public}s: " fmt, __func__, ##__VA_ARGS__)
+#define HILOGI(fmt, ...) PCLOG("%{public}s: " fmt, __func__, ##__VA_ARGS__)
+#define HILOGW(fmt, ...) PCLOG("%{public}s: " fmt, __func__, ##__VA_ARGS__)
+#define HILOGE(fmt, ...) PCLOG("%{public}s: " fmt, __func__, ##__VA_ARGS__)
+#define HILOGF(fmt, ...) PCLOG("%{public}s: " fmt, __func__, ##__VA_ARGS__)
+
+#endif
+} // namespace DistributedFS
+} // namespace OHOS
\ No newline at end of file
diff --git a/interfaces/kits/js/src/common/napi/n_class.cpp b/interfaces/kits/js/src/common/napi/n_class.cpp
new file mode 100644
index 0000000..0e9028b
--- /dev/null
+++ b/interfaces/kits/js/src/common/napi/n_class.cpp
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2021 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "n_class.h"
+
+#include
+#include
+
+#include "../log.h"
+
+namespace OHOS {
+namespace DistributedFS {
+using namespace std;
+NClass &NClass::GetInstance()
+{
+ static NClass nClass;
+ return nClass;
+}
+
+tuple NClass::DefineClass(napi_env env,
+ string className,
+ napi_callback constructor,
+ vector &&properties)
+{
+ napi_value classVal = nullptr;
+ napi_status stat = napi_define_class(env,
+ className.c_str(),
+ className.length(),
+ constructor,
+ nullptr,
+ properties.size(),
+ properties.data(),
+ &classVal);
+ if (stat != napi_ok) {
+ HILOGE("INNER BUG. Cannot define class %{public}s because of %{public}d", className.c_str(), stat);
+ }
+ return { stat == napi_ok, classVal };
+}
+
+bool NClass::SaveClass(napi_env env, string className, napi_value exClass)
+{
+ NClass &nClass = NClass::GetInstance();
+ lock_guard(nClass.exClassMapLock);
+
+ if (nClass.exClassMap.find(className) != nClass.exClassMap.end()) {
+ return true;
+ }
+
+ napi_ref constructor;
+ napi_status res = napi_create_reference(env, exClass, 1, &constructor);
+ if (res == napi_ok) {
+ nClass.exClassMap.insert({ className, constructor });
+ HILOGI("Class %{public}s has been saved", className.c_str());
+ } else {
+ HILOGE("INNER BUG. Cannot ref class constructor %{public}s because of %{public}d", className.c_str(), res);
+ }
+ return res == napi_ok;
+}
+
+napi_value NClass::InstantiateClass(napi_env env, string className, vector args)
+{
+ NClass &nClass = NClass::GetInstance();
+ lock_guard(nClass.exClassMapLock);
+
+ auto it = nClass.exClassMap.find(className);
+ if (it == nClass.exClassMap.end()) {
+ HILOGE("Class %{public}s hasn't been saved yet", className.c_str());
+ return nullptr;
+ }
+
+ napi_value cons = nullptr;
+ napi_status status = napi_get_reference_value(env, it->second, &cons);
+ if (status != napi_ok) {
+ HILOGE("INNER BUG. Cannot deref class %{public}s because of %{public}d", className.c_str(), status);
+ return nullptr;
+ }
+
+ napi_value instance = nullptr;
+ status = napi_new_instance(env, cons, args.size(), args.data(), &instance);
+ if (status != napi_ok) {
+ HILOGE("INNER BUG. Cannot instantiate the class %{public}s because of %{public}d", className.c_str(), status);
+ return nullptr;
+ }
+ return instance;
+}
+} // namespace DistributedFS
+} // namespace OHOS
\ No newline at end of file
diff --git a/interfaces/kits/js/src/common/napi/n_class.h b/interfaces/kits/js/src/common/napi/n_class.h
new file mode 100644
index 0000000..db9a90c
--- /dev/null
+++ b/interfaces/kits/js/src/common/napi/n_class.h
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2021 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "uni_header.h"
+
+#include