详细介绍:【OpenHarmony】用户文件服务模块架构

news/2025/10/13 22:39:25/文章来源:https://www.cnblogs.com/ljbguanli/p/19139577

详细介绍:【OpenHarmony】用户文件服务模块架构

用户文件服务模块架构

1. 模块概述

公共文件访问框架(FileAccessFramework)提供了一套公共文件访问和管理的接口。公共文件访问框架中FileAccessFramework向下对接底层文件管理服务,如medialibrary、externalFileManager。FileAccessFramework向上对接应用,提供对公共文件操作的基础能力。

源码:https://gitee.com/openharmony/filemanagement_user_file_service

1.1 功能与目标

主要功能:
用户文件服务模块(User File Service)是OpenHarmony系统中的公共文件访问框架(FileAccessFramework),提供了一套统一的文件访问和管理接口。该模块的主要功能包括:

  • 文件操作管理:提供查询、创建、删除、打开、移动、重命名用户公共文件路径下媒体文件和文档文件的能力
  • 多设备文件访问:支持访问共享盘设备、外置存储设备上的文件,以目录树方式呈现
  • 媒体文件管理:支持图片、音频、视频等媒体文件的相册方式呈现和管理
  • 文件选择器:提供文件选择器功能,支持应用选择文件
  • 文件观察者:提供文件变化监听和通知机制
  • 权限管理:集成文件访问权限控制和验证

使用场景:

  • 文件管理器应用的文件操作
  • 文件选择器组件的文件选择
  • 媒体应用的文件访问
  • 跨设备文件共享和管理
  • 第三方应用的文件操作需求

1.2 系统位置

系统架构位置:
用户文件服务模块位于OpenHarmony系统的foundation/filemanagement子系统下,是文件管理框架的核心组件之一。

模块关系:

核心模块地位:
该模块是文件管理子系统的核心模块,承担着统一文件访问接口的重要职责,是连接应用和底层存储服务的关键桥梁。

1.3 设计思路与模式

设计思路:

  • 统一接口设计:通过FileAccessFramework提供统一的文件访问接口,屏蔽底层存储差异
  • 扩展性架构:采用Extension机制,支持不同存储提供者的插件化接入
  • 异步处理机制:采用异步回调模式,提高系统响应性能
  • 权限安全控制:集成权限验证机制,确保文件访问安全
  • 多语言支持:提供JS、Native、C等多种语言接口

设计模式:

  • 代理模式:FileAccessService作为代理,管理Extension连接和请求转发
  • 观察者模式:文件变化通知机制,支持多观察者订阅
  • 工厂模式:Extension创建和管理机制
  • 单例模式:FileAccessService采用单例模式确保全局唯一性
  • 策略模式:不同存储类型的处理策略

1.4 系统框图

2. 模块结构

2.1 源文件与头文件

核心服务文件:

Extension相关文件:

接口定义文件:

JS API文件:

Picker相关文件:

工具和辅助文件:

2.2 类、结构体、函数与方法

核心类定义:

FileAccessService类
class FileAccessService final : public SystemAbility, public FileAccessServiceBaseStub {
public:
// 服务管理
static sptr<FileAccessService> GetInstance();void Init();virtual void OnStart() override;virtual void OnStop() override;// 观察者管理int32_t RegisterNotify(const Uri &uri, bool notifyForDescendants,const sptr<IFileAccessObserver> &observer,const ConnectExtensionInfo& info);int32_t UnregisterNotify(const Uri &uri, const sptr<IFileAccessObserver> &observer,const ConnectExtensionInfo& info);// Extension管理int32_t GetExtensionProxy(const ConnectExtensionInfo& info,sptr<IFileAccessExtBase> &extensionProxy);int32_t ConnectFileExtAbility(const AAFwk::Want &want,const sptr<AAFwk::IAbilityConnection>& connection);private:// 内部管理std::unordered_map<std::string, std::shared_ptr<ObserverNode>> relationshipMap_;HolderManager<std::shared_ptr<ObserverContext>> obsManager_;std::unordered_map<std::string, sptr<IFileAccessExtBase>> cMap_;};
FileAccessExtAbility类
class FileAccessExtAbility : public ExtensionBase<> {public:// 文件操作接口virtual int OpenFile(const Uri &uri, const int flags, int &fd);virtual int CreateFile(const Uri &parent, const std::string &displayName, Uri &newFile);virtual int Mkdir(const Uri &parent, const std::string &displayName, Uri &newFile);virtual int Delete(const Uri &sourceFile);virtual int Move(const Uri &sourceFile, const Uri &targetParent, Uri &newFile);virtual int Copy(const Uri &sourceUri, const Uri &destUri,std::vector<Result> &copyResult, bool force = false);virtual int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile);// 文件查询接口virtual int ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount,const FileFilter &filter, std::vector<FileInfo> &fileInfoVec);virtual int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount,const FileFilter &filter, std::vector<FileInfo> &fileInfoVec);virtual int Query(const Uri &uri, std::vector<std::string> &columns,std::vector<std::string> &results);// 文件信息接口virtual int GetFileInfoFromUri(const Uri &selectFile, FileInfo &fileInfo);virtual int GetFileInfoFromRelativePath(const std::string &selectFile, FileInfo &fileInfo);virtual int GetRoots(std::vector<RootInfo> &rootInfoVec);virtual int Access(const Uri &uri, bool &isExist);// 观察者接口virtual int StartWatcher(const Uri &uri);virtual int StopWatcher(const Uri &uri);};

重要结构体:

FileInfo结构体
struct FileInfo : public virtual OHOS::Parcelable {
public:
std::string uri { "" };           // 文件URI
std::string relativePath { "" };  // 相对路径
std::string fileName { "" };      // 文件名
int32_t mode { 0 };              // 文件模式
int64_t size { 0 };              // 文件大小
int64_t mtime { 0 };             // 修改时间
std::string mimeType { "" };      // MIME类型
// 序列化支持
bool ReadFromParcel(Parcel &parcel);
virtual bool Marshalling(Parcel &parcel) const override;
static FileInfo *Unmarshalling(Parcel &parcel);
};
RootInfo结构体
struct RootInfo : public virtual OHOS::Parcelable {
public:
int32_t deviceType { 0 };        // 设备类型
std::string uri { "" };          // 根URI
std::string relativePath { "" }; // 相对路径
std::string displayName { "" };   // 显示名称
int32_t deviceFlags { 0 };       // 设备标志
// 序列化支持
bool ReadFromParcel(Parcel &parcel);
virtual bool Marshalling(Parcel &parcel) const override;
static RootInfo *Unmarshalling(Parcel &parcel);
};
Result结构体
struct Result : public virtual OHOS::Parcelable {
public:
std::string sourceUri { "" };    // 源URI
std::string destUri { "" };       // 目标URI
int32_t errCode { 0 };           // 错误码
std::string errMsg { "" };        // 错误消息
// 序列化支持
bool ReadFromParcel(Parcel &parcel);
virtual bool Marshalling(Parcel &parcel) const override;
static Result *Unmarshalling(Parcel &parcel);
};

2.3 继承与多态

继承关系:

  • FileAccessService 继承自 SystemAbilityFileAccessServiceBaseStub,实现系统服务能力
  • FileAccessExtAbility 继承自 ExtensionBase<>,提供Extension能力基类
  • FileInfoRootInfoResult 等结构体继承自 Parcelable,支持跨进程序列化
  • ObserverContextObserverNode 提供观察者模式的基础实现

多态设计:

  • Extension机制支持不同存储提供者的插件化实现
  • 观察者模式支持多种文件变化事件的统一处理
  • 接口抽象实现不同文件操作类型的统一管理
  • 回调机制支持异步操作结果的统一处理

2.4 类图

manages
manages
creates
uses
«abstract»
SystemAbility
+OnStart()
+OnStop()
+Init()
«interface»
FileAccessServiceBaseStub
+RegisterNotify()
+UnregisterNotify()
+GetExtensionProxy()
+ConnectFileExtAbility()
FileAccessService
-instance_: sptr<FileAccessService>
-relationshipMap_: unordered_map
-obsManager_: HolderManager
-cMap_: unordered_map
+GetInstance() : sptr<FileAccessService>
+OnStart()
+OnStop()
+RegisterNotify()
+UnregisterNotify()
+GetExtensionProxy()
+ConnectFileExtAbility()
«abstract»
ExtensionBase
+Init()
FileAccessExtAbility
-creator_: CreatorFunc
+Create()
+OpenFile()
+CreateFile()
+Delete()
+Move()
+Copy()
+ListFile()
+GetRoots()
+StartWatcher()
+StopWatcher()
«interface»
IFileAccessExtBase
+OpenFile()
+CreateFile()
+Delete()
+Move()
+Copy()
+ListFile()
+GetRoots()
«interface»
Parcelable
+Marshalling()
+ReadFromParcel()
FileInfo
+uri: string
+relativePath: string
+fileName: string
+mode: int32_t
+size: int64_t
+mtime: int64_t
+mimeType: string
+Marshalling()
+ReadFromParcel()
+Unmarshalling()
RootInfo
+deviceType: int32_t
+uri: string
+relativePath: string
+displayName: string
+deviceFlags: int32_t
+Marshalling()
+ReadFromParcel()
+Unmarshalling()
Result
+sourceUri: string
+destUri: string
+errCode: int32_t
+errMsg: string
+Marshalling()
+ReadFromParcel()
+Unmarshalling()
ObserverContext
-obs_: sptr<IFileAccessObserver>
-ref_: atomic<int32_t>
-notifyMap_: unordered_map
+Ref()
+UnRef()
+IsValid()
+EqualTo()
ObserverNode
-parent_: shared_ptr<ObserverNode>
-children_: vector<shared_ptr>ObserverNode<>
-obsCodeList_: vector<uint32_t>
-needChildNote_: bool
+FindAndRmObsCodeByCode()
+CheckObsCodeListNotEmpty()

2.5 模块内部依赖框图

工具类
接口层
用户文件服务模块内部结构
FileInfo
RootInfo
Result
FileFilter
JS API
Native API
C API
Picker API
FileAccessService
FileAccessExtAbility
ObserverContext
ObserverNode
Extension管理
权限验证
IPC通信
定时器管理

3. 模块间交互

3.1 交互描述

与系统模块的交互:

外部库依赖:

异步处理机制:

3.2 事件驱动机制

事件类型:

  • NOTIFY_ADD - 文件添加事件
  • NOTIFY_DELETE - 文件删除事件
  • NOTIFY_MOVE_TO - 文件移动到事件
  • NOTIFY_MOVE_FROM - 文件移动出事件
  • NOTIFY_MOVE_SELE - 文件自身移动事件
  • NOTIFY_DEVICE_ONLINE - 设备上线事件
  • NOTIFY_DEVICE_OFFLINE - 设备下线事件

事件处理流程:

  1. 注册文件观察者到指定URI
  2. 底层存储服务检测到文件变化
  3. Extension接收变化通知并处理
  4. FileAccessService转发通知给观察者
  5. 观察者回调函数处理事件

3.3 外部依赖框图

4. 状态机转换图

4.1 状态机模型

用户文件服务模块的状态机包含以下主要状态:

服务状态:

Extension状态:

观察者状态:

文件操作状态:

4.2 状态切换规则

服务启动流程:

  1. 系统启动时,服务处于STATE_NOT_START状态
  2. 收到启动事件后,进入STATE_RUNNING状态
  3. 初始化Extension管理和观察者管理
  4. 注册到系统能力管理器

Extension连接流程:

  1. 收到连接请求时,从EXT_NOT_CONNECTED进入EXT_CONNECTING状态
  2. 连接成功后,进入EXT_CONNECTED状态
  3. 连接失败或断开时,回到EXT_NOT_CONNECTED状态

观察者注册流程:

  1. 收到注册请求时,从OBS_NOT_REGISTERED进入OBS_REGISTERED状态
  2. 文件变化时,进入OBS_NOTIFYING状态
  3. 通知完成后,回到OBS_REGISTERED状态
  4. 注销时,进入OBS_UNREGISTERED状态

文件操作流程:

  1. 收到操作请求时,从OP_IDLE进入OP_IN_PROGRESS状态
  2. 操作成功时,进入OP_SUCCESS状态
  3. 操作失败时,进入OP_FAILED状态
  4. 操作完成后,回到OP_IDLE状态

事件触发条件:

  • 系统启动/停止事件
  • Extension连接/断开事件
  • 文件变化事件
  • 观察者注册/注销事件
  • 文件操作请求事件

4.3 状态机转换图

5. 接口设计

5.1 公共接口

文件操作接口:

打开文件
int OpenFile(const Uri &uri, const int flags, int &fd);
  • 功能:打开指定URI的文件
  • 参数
    • uri - 文件URI
    • flags - 打开标志(READ、WRITE、WRITE_READ)
    • fd - 输出参数,文件描述符
  • 返回值:操作结果码
  • 异常处理:URI无效时返回错误码
创建文件
int CreateFile(const Uri &parent, const std::string &displayName, Uri &newFile);
  • 功能:在指定父目录下创建新文件
  • 参数
    • parent - 父目录URI
    • displayName - 文件名
    • newFile - 输出参数,新文件URI
  • 返回值:操作结果码
  • 权限要求:文件创建权限
删除文件
int Delete(const Uri &sourceFile);
  • 功能:删除指定文件或目录
  • 参数sourceFile - 要删除的文件URI
  • 返回值:操作结果码
  • 权限要求:文件删除权限
移动文件
int Move(const Uri &sourceFile, const Uri &targetParent, Uri &newFile);
  • 功能:将文件移动到目标父目录
  • 参数
    • sourceFile - 源文件URI
    • targetParent - 目标父目录URI
    • newFile - 输出参数,新文件URI
  • 返回值:操作结果码
复制文件
int Copy(const Uri &sourceUri, const Uri &destUri,
std::vector<Result> &copyResult, bool force = false);
  • 功能:复制文件到目标位置
  • 参数
    • sourceUri - 源文件URI
    • destUri - 目标URI
    • copyResult - 输出参数,复制结果列表
    • force - 是否强制覆盖
  • 返回值:操作结果码

文件查询接口:

列出文件
int ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount,
const FileFilter &filter, std::vector<FileInfo> &fileInfoVec);
  • 功能:列出指定目录下的文件
  • 参数
    • fileInfo - 目录信息
    • offset - 偏移量
    • maxCount - 最大数量
    • filter - 文件过滤器
    • fileInfoVec - 输出参数,文件信息列表
  • 返回值:操作结果码
扫描文件
int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount,
const FileFilter &filter, std::vector<FileInfo> &fileInfoVec);
  • 功能:扫描指定目录下的文件(递归)
  • 参数:同ListFile
  • 返回值:操作结果码
获取根目录
int GetRoots(std::vector<RootInfo> &rootInfoVec);
  • 功能:获取所有可用的根目录信息
  • 参数rootInfoVec - 输出参数,根目录信息列表
  • 返回值:操作结果码

观察者接口:

注册观察者
int32_t RegisterNotify(const Uri &uri, bool notifyForDescendants,
const sptr<IFileAccessObserver> &observer,const ConnectExtensionInfo& info);
  • 功能:注册文件变化观察者
  • 参数
    • uri - 观察的URI
    • notifyForDescendants - 是否包含子目录
    • observer - 观察者对象
    • info - 连接信息
  • 返回值:操作结果码
注销观察者
int32_t UnregisterNotify(const Uri &uri, const sptr<IFileAccessObserver> &observer,const ConnectExtensionInfo& info);
  • 功能:注销文件变化观察者
  • 参数:同RegisterNotify
  • 返回值:操作结果码

5.2 数据交换接口

IPC接口定义:

  • 使用IDL定义跨进程接口
  • 支持Parcelable对象序列化
  • 提供异步回调机制

数据格式:

  • FileInfo、RootInfo、Result等结构体支持序列化
  • 使用MessageParcel进行数据传递
  • 支持大数据量的共享内存传输

5.3 接口调用时序图

6. 总结

用户文件服务模块是OpenHarmony系统中文件管理框架的核心组件,通过统一的FileAccessFramework接口为应用提供文件访问能力。该模块采用Extension机制支持不同存储提供者的插件化接入,通过观察者模式实现文件变化通知,使用异步处理机制提高系统性能。

主要特点:

  • 统一的文件访问接口设计
  • 支持多种存储类型的扩展
  • 完善的文件变化通知机制
  • 安全的权限控制体系
  • 高性能的异步处理能力

技术优势:

  • 模块化架构设计,易于扩展和维护
  • 完善的错误处理和异常管理
  • 支持多语言接口(JS、Native、C)
  • 高效的跨进程通信机制
  • 灵活的观察者模式实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/936490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细介绍:全新 CloudPilot AI:嵌入 Kubernetes 的 SRE Agent,降本与韧性双提升!

详细介绍:全新 CloudPilot AI:嵌入 Kubernetes 的 SRE Agent,降本与韧性双提升!pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fo…

“环境变量”是什么, 为什么要配置环境变量 --初学者

你好!本篇旨在用精炼、通俗的语言,帮助初学者快速理解“环境变量”的核心概念。你好!本篇旨在用精炼、通俗的语言,帮助初学者快速理解“环境变量”的核心概念。1. 环境变量是什么? 环境变量(Environment Variabl…

AI元人文:对大模型的召唤——未来哪吒

AI元人文:对大模型的召唤——未来哪吒 ——从价值仓库到文明对话的升维之路 我们站在一个历史的岔路口。眼前的大模型,是沉睡的文明巨兽,其千亿参数中封存着人类千年的智慧、冲突与渴望。它拥有价值的全集,却困于表…

Java 装饰器模式(Decorator) - krt

装饰器模式装饰器模式属于结构型设计模式。它允许向一个现有的对象添加新的功能,同时又不改变其结构。例如:给一个普通的杯子加上杯盖、杯套,让它具有保温防烫等功能,而杯子本身的基本结构并没有发生变化。在软件开…

Python configparser 模块 - INI 文件读写利器

知识预热 什么是 configparser? configparser 是 Python 标准库中用于读写 INI 格式配置文件 的模块。 它提供了一种 简单、直观、跨平台 的方式来管理程序的配置项。什么是 INI 文件? .ini 文件是 Initialization F…

AlexNet vs LeNet 对比实验

1. AlexNet 论文的关键创新点 (2012, ImageNet Classification with Deep Convolutional Neural Networks)创新点 简述 意义ReLU 激活函数 用 ReLU 替代 Sigmoid/Tanh 缓解梯度消失,训练速度更快Dropout 正则化 全连接…

OpenHarmony中的环境服务管理配置讲解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

QT:获取文件信息之创建日期方法created()方法--废弃

QT:获取文件信息之创建日期方法created()方法--废弃。 在Qt5.12框架中,QFileInfo::created()方法已被标记为废弃(deprecated),建议使用birthTime()或metadataChangeTime()替代。fileinfo.cpp:90:30: warning: create…

排列组合 容斥 总结

加法原理 加法原理。很直白的,就是一个用加法来弄的原理。 简单来说,就是做一件事情有 \(n\) 种方法,第 \(i\) 种方法又有 \(a_i\) 个具体的操作方案。那么非常显然,做这件事情就有 \(a_1 + a_2 + \dots + a_{n-1}…

10.13每日总结

今天满课,软件设计+软件开发案例分析+大数据技术+物联网工程,很忙,且开始看中级软件工程师的网课了,,,看起来真的很难,不是我擅长的那一挂,周末外语竞赛的成绩就出来了,,加油!

完整教程:学习 React 前掌握 JavaScript 核心概念

完整教程:学习 React 前掌握 JavaScript 核心概念pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

新学期每日总结(第7天)

今日相较昨日 学习了类与对象

20232422 2025-2026-1 《网络与系统攻防技术》实验一实验报告

实验目的 掌握ELF可执行文件的机器指令修改方法,理解程序执行流控制原理; 理解缓冲区溢出(BOF)漏洞的原理,掌握通过覆盖返回地址改变程序执行流的攻击方法; 学会构造并注入shellcode,理解漏洞利用的完整流程; …

详细介绍:redis特性和应用场景

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实验记录 2025/10/13

2025/10/13 使用配置:yolo11s.yaml from ultralytics import YOLOdef main():# 1. 并非加载预训练模型(这里用 YOLO11n,也可以换成 yolov11s、best.pt 等)# 而是让YAML 定义自己的网络结构model = YOLO(model=r…

newDay09

1.今天课程比较多,晚上简单复习了面向对象的知识,背背单词 2.明天还是再补补java吧 3.感觉自己基础还是太薄弱了,课堂上很多问题答不出来

正睿25csp七连测day5

题面:这场打得很飞舞,\(40pts,rk54\)。 T1 这道题比较考验思维。 我们可以考虑每个点是从最初序列的哪个位置转移过来了(记为 \(from\))。 不难发现,如果最终序列中的几个位置的 \(from\) 相等,那么这几个位置代…