成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

OpenHarmony基線功能之文件管理

系統 OpenHarmony
本文將重點關注文件管理部分的API,試圖厘清文件管理在OpenHarmony如何從應用到操作系統,如何工作的。

??想了解更多內容,請訪問:??

??51CTO和華為官方合作共建的鴻蒙技術社區??

??https://ost.51cto.com??

概述

文件管理作為操作系統的一個核心基本功能,為每個應用開發者所關注,操作系統本身的許多功能亦基于文件,而對于應用來說,可以說沒有文件系統,就不能有應用的業務,可能會有很多人反駁,可以把數據保存到數據庫,但數據庫歸根結底還是文件。大家在HarmonyOS官網看API參考時,可以看到OpenHarmony提供了三種API:JAVA API參考、Native API參考和JS API參考。

https://developer.harmonyos.com/cn/docs/documentation/doc-references/reference-document-outline-0000001115016824。

本文將重點關注文件管理部分的API,試圖厘清文件管理在OpenHarmony如何從應用到操作系統,如何工作的。重點梳理三個方面:

  1. 文件管理都有哪些接口供應用調用。
  2. 怎么調用到操作系統的。
  3. 操作系統怎么工作的。

希望讀者能盡可能多的參與進來一起評論,查漏補缺,以便筆者逐步完善內容,讓開源越來越好。

接口

備注:

1、限于表格限制,不會列所有,詳細可以查閱官方api文檔:https://developer.harmonyos.com/cn/docs/documentation/doc-references/files-0000001054678506#ZH-CN_TOPIC_0000001054678506__createFile-java_nio_file_Path-java_nio_file_attribute_FileAttribute___-。

2、Native API也可以用標準c、c++進行文件操作。

3、JS API @ohos.fileio提供了三種調用方式,分別是Promise、Callback和同步方式。

4、@ohos.fileio:基于手機(Phone)、平板(Tablet)、智慧屏(TV)或智能穿戴(Wearable)的模板進行開發時使用。

5、@system.file:基于輕量級智能穿戴(Lite Wearable)的模板進行開發時使用。

JS API文件接口的使用

接口文檔中都提供了樣例,開發者可以比較清楚地知道怎么調用API以實現功能。

import fileio from '@ohos.fileio';
let fd = fileio.openSync(path, 0o2);
let buf = new ArrayBuffer(4096);
let res = await fileio.read(fd, buf);

打開DevEco Studio 3.0.0.800,在應用代碼中調用JS API樣例。

可以看到@ohos.fileio定義在External Libraries/Gradle:ACE JS-common-3.0.0.1\common里面。

打開@ohos.fileio.d.ts可以看到所有函數的定義。

這里出現了一個大問號,為什么只有定義沒有實現呢?這里就引入下一章節,是所有JS API的通用技術,并非文件管理專有。因為OpenHarmony是基于Linux的,最終要調用到c實現,對于JAVA API應該是調用到JAVA虛擬機直接進行文件操作,java也是c實現的,Native API直接調用c函數實現,所以這里只追一下JS API是如何實現調用到操作系統api的。

NAPI

NAPI:JavaScript API框架。

介紹比較全面的,可以參見(https://harmonyos.51cto.com/posts/8390)。

模塊都有一個export()方法,將js的api映射到具體的c++函數。

實現

以@fileio.read和@fileio.readSync為例:

${KaihongOS}\foundation\distributeddatamgr\distributedfile\interfaces\kits\js\src\mod_fileio\class_dir\dir_n_exporter.cpp。

napi_value DirNExporter::Read(napi_env env, napi_callback_info info)
{
NFuncArg funcArg(env, info);
if (!funcArg.InitArgs(NARG_CNT::ZERO, NARG_CNT::ONE)) {
UniError(EINVAL).ThrowErr(env, "Number of arguments unmatched");
return nullptr;
}
auto dirEntity = NClass::GetEntityOf<DirEntity>(env, funcArg.GetThisVar());
if (!dirEntity) {
UniError(EIO).ThrowErr(env, "Cannot get entity of Dir");
return nullptr;
}
if (!dirEntity || !dirEntity->dir_) {
UniError(EBADF).ThrowErr(env, "Dir has been closed yet");
return nullptr;
}
DIR *dir = dirEntity->dir_.get();
auto arg = make_shared<DirReadArgs>(NVal(env, funcArg.GetThisVar()));
auto cbExec = [arg, dir, dirEntity](napi_env env) -> UniError {
struct dirent tmpDirent;
lock_guard(dirEntity->lock_);
errno = 0;
dirent *res = nullptr;
do {
res = readdir(dir);
if (res == nullptr && errno) {
return UniError(errno);
} else if (res == nullptr) {
return UniError(ERRNO_NOERR);
} else if (string(res->d_name) == "." || string(res->d_name) == "..") {
continue;
} else {
tmpDirent = *res;
break;
}
} while (true);
arg->dirRes = tmpDirent;
return UniError(ERRNO_NOERR);
};
auto cbCompl = [arg](napi_env env, UniError err) -> NVal {
return DoReadCompile(env, err, arg);
};
NVal thisVar(env, funcArg.GetThisVar());

if (funcArg.GetArgc() == NARG_CNT::ZERO) {
return NAsyncWorkPromise(env, thisVar).Schedule("fileioDirRead", cbExec, cbCompl).val_;
} else {
NVal cb(env, funcArg[NARG_POS::FIRST]);
return NAsyncWorkCallback(env, thisVar, cb).Schedule("fileioDirRead", cbExec, cbCompl).val_;
}
}

1、讀取參數。

2、遞歸讀取路徑readdir。

3、返回Promise或者回調。

napi_value DirNExporter::ReadSync(napi_env env, napi_callback_info info)
{
NFuncArg funcArg(env, info);
if (!funcArg.InitArgs(NARG_CNT::ZERO)) {
UniError(EINVAL).ThrowErr(env, "Number of arguments unmatched");
return nullptr;
}
DirEntity *dirEntity = GetDirEntity(env, info);
if (!dirEntity || !dirEntity->dir_) {
UniError(EBADF).ThrowErr(env, "Dir has been closed yet");
return nullptr;
}
struct dirent tmpDirent;
{
lock_guard(dirEntity->lock_);
errno = 0;
dirent *res = nullptr;
do {
res = readdir(dirEntity->dir_.get());
if (res == nullptr && errno) {
UniError(errno).ThrowErr(env);
return nullptr;
} else if (res == nullptr) {
return NVal::CreateUndefined(env).val_;
} else if (string(res->d_name) == "." || string(res->d_name) == "..") {
continue;
} else {
tmpDirent = *res;
break;
}
} while (true);
}
napi_value objDirent = NClass::InstantiateClass(env, DirentNExporter::className_, {});
if (!objDirent) {
return nullptr;
}
auto direntEntity = NClass::GetEntityOf<DirentEntity>(env, objDirent);
if (!direntEntity) {
return nullptr;
}
direntEntity->dirent_ = tmpDirent;
return objDirent;
}

1、讀取參數。

2、讀取路徑:readdir。

3、返回獲取到的路勁信息objDirent。

都會調到c語言標準函數。

??想了解更多內容,請訪問:??

??51CTO和華為官方合作共建的鴻蒙技術社區??

??https://ost.51cto.com??

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2022-03-30 14:07:47

Harmony操作系統鴻蒙

2021-11-25 09:54:54

鴻蒙HarmonyOS應用

2021-12-14 14:45:38

鴻蒙HarmonyOS應用

2022-03-29 10:04:44

APIHarmony文件管理

2022-06-13 14:18:39

電源管理子系統耗電量服務

2022-03-04 15:43:36

文件管理模塊Harmony鴻蒙

2022-07-05 16:03:29

電源管理子系統鴻蒙

2022-02-28 14:54:48

openHarmon鴻蒙操作系統

2022-05-26 15:28:03

網絡管理Socket 模塊

2022-08-12 19:07:58

電源管理子系統鴻蒙

2023-04-12 15:31:11

系統服務管理鴻蒙

2022-05-24 15:06:57

AbilityeTS FA鴻蒙

2021-09-24 09:25:01

鴻蒙HarmonyOS應用

2022-08-17 16:38:46

WLAN接口組件功能

2023-07-26 09:41:57

內核編程接口線程管理

2021-11-18 10:28:03

鴻蒙HarmonyOS應用

2024-03-26 15:25:55

應用接口文件轉換工具鴻蒙

2022-03-03 18:39:01

Harmonyioremap鴻蒙

2023-06-20 15:45:15

服務卡片鴻蒙

2022-03-21 15:02:05

Harmonyhiperf鴻蒙
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久激情 | 久久久久国产精品午夜一区 | 亚洲有码转帖 | 日韩不卡三区 | 国产精品欧美一区二区三区 | 成人激情视频免费观看 | 福利精品在线观看 | 色接久久 | av天天干 | 精品日韩一区二区三区av动图 | 日韩欧美精品在线 | 国产精品国产三级国产aⅴ中文 | 日韩高清国产一区在线 | 午夜久久久 | 国产乱码精品一区二三赶尸艳谈 | 正在播放国产精品 | 亚洲三区视频 | 色综合色综合网色综合 | 国产精品日韩高清伦字幕搜索 | 日韩亚洲视频 | 国产欧美日韩在线观看 | 在线伊人网 | 亚洲人人 | 日韩精品一区二区三区视频播放 | 国产亚洲一区二区精品 | 亚洲欧美一区二区在线观看 | 91伊人 | 国产精品精品视频一区二区三区 | 免费午夜视频在线观看 | 一a级片 | 91精品久久久久久久久久入口 | 精品乱码一区二区三四区视频 | 日韩午夜影院 | 中文字幕免费中文 | 福利在线观看 | 91久久精品一区二区二区 | 久久久久久久久国产成人免费 | 天堂色综合 | 亚洲电影一区二区三区 | 日韩免费视频 | 91精品久久久久久久久中文字幕 |