当前位置: 首页 > 科技观察

OpenHarmony基线功能文件管理

时间:2023-03-17 15:31:06 科技观察

更多内容请访问:与华为官方共建的鸿蒙技术社区https://ost.51cto.com文件管理概述作为操作系统的核心基础功能,这是每个应用程序开发人员都关心的问题。操作系统本身的很多功能也是基于文件的。对于应用来说,可以说没有文件系统就没有应用业务。可能有很多人反驳说数据可以保存到数据库中,但是数据库归根结底还是一个文件。查看HarmonyOS官网的API参考,可以看到OpenHarmony提供了三种API:JAVAAPI参考、NativeAPI参考和JSAPI参考。https://developer.harmonyos.com/cn/docs/documentation/doc-references/reference-document-outline-0000001115016824。本文将重点介绍文件管理部分的API,试图从应用程序到操作系统,阐明文件管理在OpenHarmony中是如何工作的。关注三个方面:文件管理有哪些接口可供应用程序调用。如何调用操作系统。操作系统如何工作。希望广大读者尽可能多的参与,一起评论,查漏补缺,让作者逐步完善内容,把开源做的越来越好。界面备注: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.NativeAPI也可以使用标准的c和c++进行文件操作。3、JSAPI@ohos.fileio提供了三种调用方式,分别是Promise、Callback和synchronization。4、@ohos.fileio:开发基于手机(Phone)、平板(Tablet)、智慧屏(TV)或智能穿戴(Wearable)的模板时使用。5、@system.file:基于LiteWearable模板开发时使用。JSAPI文件接口的用户界面文档中提供了样例,开发者可以清楚的知道如何调用API来实现功能。importfileiofrom'@ohos.fileio';letfd=fileio.openSync(path,0o2);letbuf=newArrayBuffer(4096);letres=awaitfileio.read(fd,buf);打开DevEcoStudio3.0.0.800,在应用程序代码中调用JSAPI示例。可以看到在ExternalLibraries/Gradle:ACEJS-common-3.0.0.1\common中定义了@ohos.fileio。打开@ohos.fileio.d.ts可以看到所有函数的定义。这里有个大大的问号,为什么只有定义没有实现呢?这里是下一章的介绍,是所有JSAPI的通用技术,不是文件管理独有的。因为OpenHarmony是基于Linux的,所以最后需要调用c来实现。对于JAVAAPI,应该调用到JAVA虚拟机直接进行文件操作。Java也在c中实现。NativeAPI直接调用c函数来实现,所以这里我们只按照JSAPI如何实现对操作系统api的调用。NAPINAPI:JavaScriptAPI框架。更全面的介绍见(https://harmonyos.51cto.com/posts/8390)。每个模块都有一个export()方法,它将jsapi映射到特定的c++函数。以@fileio.read和@fileio.readSync为例:${KaihongOS}\foundation\distributeddatamgr\distributedfile\interfaces\kits\js\src\mod_fileio\class_dir\dir_n_exporter.cpp。napi_valueDirNExporter::Read(napi_envenv,napi_callback_infoinfo){NFuncArgfuncArg(env,info);if(!funcArg.InitArgs(NARG_CNT::ZERO,NARG_CNT::ONE)){UniError(EINVAL).ThrowErr(env,"参数数量不匹配");返回空指针;}autodirEntity=NClass::GetEntityOf(env,funcArg.GetThisVar());if(!dirEntity){UniError(EIO).ThrowErr(env,"无法获取Dir的实体");返回空指针;}if(!dirEntity||!dirEntity->dir_){UniError(EBADF).ThrowErr(env,"Dirhasbeenclosedyet");返回空指针;}DIR*dir=dirEntity->dir_.get();autoarg=make_shared(NVal(env,funcArg.GetThisVar()));autocbExec=[arg,dir,dirEntity](napi_envenv)->UniError{structdirenttmpDirent;锁卫(dirEntity->lock_);错误号=0;dirent*res=nullptr;做{res=readdir(dir);我f(res==nullptr&&errno){returnUniError(errno);}elseif(res==nullptr){returnUniError(ERRNO_NOERR);}elseif(string(res->d_name)=="."||string(res->d_name)==".."){继续;}else{tmpDirent=*res;休息;}}而(真);arg->dirRes=tmpDirent;返回UniError(ERRNO_NOERR);};autocbCompl=[arg](napi_envenv,UniErrorerr)->NVal{returnDoReadCompile(env,err,arg);};NValthisVar(env,funcArg.GetThisVar());如果(funcArg.GetArgc()==NARG_CNT::ZERO){returnNAsyncWorkPromise(env,thisVar).Schedule("fileioDirRead",cbExec,cbCompl).val_;}else{NValcb(env,funcArg[NARG_POS::FIRST]);返回NAsyncWorkCallback(env,thisVar,cb).Schedule("fileioDirRead",cbExec,cbCompl).val_;}}1、读取参数2、递归读取路径readdir。3.返回Promise或回调。napi_valueDirNExporter::ReadSync(napi_envenv,napi_callback_infoinfo){NFuncArgfuncArg(env,info);if(!funcArg.InitArgs(NARG_CNT::ZERO)){UniError(EINVAL).ThrowErr(env,"参数数量不匹配");返回空指针;}DirEntity*dirEntity=GetDirEntity(env,info);if(!dirEntity||!dirEntity->dir_){UniError(EBADF).ThrowErr(env,"目录已关闭");返回空指针;}结构direnttmpDirent;{lock_guard(dirEntity->lock_);错误号=0;dirent*res=nullptr;做{res=readdir(dirEntity->dir_.get());if(res==nullptr&&errno){UniError(errno).ThrowErr(env);返回空指针;}elseif(res==nullptr){returnNVal::CreateUndefined(env).val_;}elseif(string(res->d_name)=="."||string(res->d_name)==".."){继续;}else{tmpDirent=*res;休息;}}而(真);}napi_valueobjDirent=NClass::InstantiateClass(env,DirentNExporter::className_,{});如果(!objDirent){返回nullptr;}autodirentEntity=NClass::GetEntityOf(env,objDirent);如果(!direntEntity){返回nullptr;}direntEntity->dirent_=tmpDirent;returnobjDirent;}1.读取参数2.读取路径:readdir。3.返回获取的道路强度信息objDirent。将调用到C语言标准函数。更多信息请访问:与华为官方共建的鸿蒙技术社区https://ost.51cto.com