目录功能

目录功能 允许组件 连接到由另一个组件提供的目录。

如需了解每个组件隔离的目录,请参阅 存储空间

提供目录功能

要提供目录功能,组件必须声明该功能, 从 self 路由。该组件用于托管 其 传出目录 ,了解所有最新动态。

如需定义该 capability,请为其添加 capabilities 声明:

{
    capabilities: [
        {
            directory: "data",
            rights: ["r*"],
            path: "/published-data",
        },
    ],
}

这定义了一个由此组件托管的功能,其传出目录路径 为 /published-data,且其最大可用时长 rights 为“read-only”。

路由目录功能

组件通过向目录功能公开来路由目录功能 提供给子女。

如需详细了解该框架如何路由组件功能, 请参阅功能路由

曝光

公开目录功能可让组件的父级访问该 capability。 功能:

{
    expose: [
        {
            directory: "data",
            from: "self",
        },
    ],
}

您可以选择指定以下内容:

成为协作者

提供存储空间功能可让子组件访问该功能 功能:

{
    offer: [
        {
            directory: "data",
            from: "parent",
            to: [ "#child-a", "#child-b" ],
        },
    ],
}

您可以选择指定以下内容:

使用目录功能

要使用存储空间功能,组件必须请求该功能, 在其 命名空间 ,了解所有最新动态。

如需请求该功能,请为其添加 use 声明:

{
    use: [
        {
            directory: "data",
            rights: ["r*"],
            path: "/data",
        },
    ],
}

这会使用提供的 path 中的目录填充组件的命名空间 包含共享目录内容。

您必须指定 rights。 您可以选择指定 subdir

使用可选目录功能

请参阅连接组件:使用可选功能

目录功能权限

通过目录权限,组件可以按原样控制对目录的访问权限 在整个系统中路由目录权限的应用方式如下:

  • capabilities必需。 提供适用于目录的基本权限集。任何权利 useofferexpose 中指定的对象必须是 。
  • use必需。 描述使用方组件请求的访问权限。
  • offer可选。 可用于目标组件的已修改权限。继承权限 (如果不存在)。offer
  • expose可选。 可用于目标组件的已修改权限。继承权限 (如果不存在)。expose

rights 字段可以包含以下各项的任意组合 fuchsia.io.Rights 个词元:

rights: [
  "connect",
  "enumerate",
  "traverse",
  "read_bytes",
  "write_bytes",
  "execute_bytes",
  "update_attributes",
  "get_attributes",
  "modify_directory",
]

该框架提供了使用别名声明 rights 的简化形式。 每个别名都代表 FIDL 权利令牌的组合,以提供通用 读取、写入或执行访问权限:

别名 FIDL 权利
r* connect, enumerate, traverse, read_bytes, get_attributes
w* connect, enumerate, traverse, write_bytes, update_attributes, modify_directory
x* connect, enumerate, traverse, execute_bytes
rw* connect, enumerate, traverse, read_bytes, write_bytes, get_attributes, update_attributes, modify_directory
rx* connect, enumerate, traverse, read_bytes, execute_bytes, get_attributes

rights 字段只能包含一个别名。其他 FIDL 权利可能为 只要这些权利不重复以别名形式表示的权利,就可以附加。

示例

请考虑以下示例,其中组件 A 请求读写权限 复制到 data 目录:

// A.cml
{
    use: [
        {
            directory: "data",
            rights: ["rw*"],
            path: "/data",
        },
    ],
}

不过,父组件 B 会向组件 A 提供目录 data 仅具有只读权限。在这种情况下,路由失败,data 也不会 存在于 A 的命名空间中。

// B.cml
{
    capabilities: [
        {
            directory: "data",
            rights: ["r*"],
            path: "/published-data",
        },
    ],
    offer: [
        {
            directory: "data",
            from: "self",
            to: [ "#A" ],
        },
    ],
}

子目录

您可以对目录功能的子目录使用 exposeofferuse 方法:

{
    offer: [
        {
            directory: "data",
            from: "parent",
            to: [ "#child-a", "#child-b" ],
            subdir: "children",
        },
    ],
}

重命名目录

您可以通过其他名称使用 exposeoffer 目录功能:

{
    offer: [
        {
            directory: "data",
            from: "#child-a",
            to: [ "#child-b" ],
            as: "a-data",
        },
    ],
}