@heybox/hb-sdk API Reference - v0.9.5
    正在准备搜索索引...

    接口 FileHandle

    当前 SDK session 中的文件代理。

    代理是冻结的能力对象,不是原生 File 或文件路径。picker / saveFile() 返回的精确授权仅在当前 Runtime session 有效;sandbox 或已授权目录派生的逻辑代理不会在创建时执行 I/O。

    interface FileHandle {
        kind: "file";
        mode: FileMode;
        name: string;
        create(options?: CreateOptions): Promise<FileHandle>;
        exists(): Promise<boolean>;
        readBytes(): Promise<Uint8Array<ArrayBufferLike>>;
        readText(): Promise<string>;
        remove(): Promise<void>;
        stat(): Promise<FileStat>;
        writeBytes(content: Uint8Array): Promise<void>;
        writeText(content: string): Promise<void>;
    }
    索引

    属性

    kind: "file"

    可用于区分文件与目录的固定标记。

    mode: FileMode

    当前代理被授予的访问模式。

    name: string

    文件 basename,不包含父目录或真实路径。

    方法

    • 确保文件存在并返回同一个代理。

      参数

      • 可选options: CreateOptions

        可选的父目录创建与目标独占创建设置。省略时等同于 { recursive: false, exclusive: false };完整语义见 CreateOptions。

      返回 Promise<FileHandle>

      当前同一个 FileHandle proxy;成功后 result === file。方法不会读取文件,且默认的 ensure-exists 不会截断或改写已有内容。

      HbMiniProgramSDKError options 非对象,或 recursive / exclusive 不是 boolean 时 返回 INVALID_PARAMS;代理不是 readwrite 时在发送 bridge 请求前返回 FILE_ACCESS_DENIED。

      HbMiniProgramSDKError 当前运行快照缺少或未启用 filesystem 时返回 PERMISSION_NOT_IN_SNAPSHOT / PERMISSION_DENIED;Host 未开放或未协商到 file.create 时返回 METHOD_FORBIDDEN,旧 Runtime 可返回 METHOD_NOT_FOUND。

      HbMiniProgramSDKError recursive: false 且父目录缺失时返回 DIRECTORY_NOT_FOUND;目标实际是目录或路径中的祖先实际是文件时返回 FILE_TYPE_MISMATCH; exclusive: true 且文件已存在时返回 FILE_ALREADY_EXISTS。

      HbMiniProgramSDKError 外部 direct handle 已失效或不属于当前 Runtime session 时返回 FILE_ACCESS_REVOKED;Host 创建失败、响应异常或底层平台 I/O 失败时返回相应稳定文件错误码, 无法识别的 Host 错误统一为 FILE_IO_FAILED。

      目标缺失时创建空文件。recursive: true 会在当前逻辑 root 内同时创建缺失父目录;它不会允许 ..、绝对路径或跨越用户授权边界。目标已是文件时,默认调用作为幂等的 ensure-exists 成功, 保留原内容;需要检测冲突时传 exclusive: true。若目标实际为目录,不会把目录替换为文件。

      调用要求当前代理的 mode === 'readwrite'。sandbox 文件固定继承 readwrite;从用户选择的目录 派生时继承该目录的 mode,因此只读目录的后代不能创建。用户选择或 saveFile() 返回的精确 外部 File 也只能在获授 readwrite 时调用;操作仍局限于该精确文件,不能取得父目录或兄弟文件。 Runtime 会重新校验 direct handle 的 session/provenance,Host 还会绑定当前 Mini-program identity。 该方法不需要可信用户手势,也不会创建新的 direct handle、消耗 1024 个外部授权句柄配额或暴露真实路径。

      新 PC Host 支持该 operation;Android/iOS 需要 1.3.396+ 并以 system.describe 实际宣告的 operation 为准,OHOS 同样按 Host 协商结果启用。外部精确 File 只有实际获授 readwrite 时才能调用本方法;较早 Android 客户端可能仅授予 read。Web、Browser Dev Host、旧 Host 或 operation 集不完整时 fail closed,不提供 Blob 或内存 fallback。

      create() 只创建空目标。父目录已经存在时,FileHandle.writeText / FileHandle.writeBytes 也可隐式创建文件并写入内容;它们不会自动创建父目录。若需要先确保 目录存在,使用 DirectoryHandle.create;只需探测目标时使用 FileHandle.exists。

      import hbSDK, { HbMiniProgramSDKError } from '@heybox/hb-sdk'

      const report = hbSDK.files.sandbox.file('reports/2026/summary.json')
      const sameReport = await report.create({ recursive: true })
      console.assert(sameReport === report)

      await report.writeText('{"ready":true}')
      await report.create() // 已存在时成功,原内容不变
      console.log(await report.readText())

      try {
      await report.create({ exclusive: true })
      } catch (error) {
      if (!(error instanceof HbMiniProgramSDKError) || error.code !== 'FILE_ALREADY_EXISTS') throw error
      }

      0.8.0

      android

      ios

      ohos

      windows

      macos

      android numeric-dot >= 1.3.396

      ios numeric-dot >= 1.3.396

      ohos none

      windows none

      macos none

    • 检查当前代理是否仍解析到一个文件。

      返回 Promise<boolean>

      Host 能取得目标且确认其类型为文件时返回 true。目标文件不存在、任一祖先目录 不存在,或同一逻辑位置实际是目录时返回 false;这些正常的“不存在”结果不会抛出 FILE_NOT_FOUND、DIRECTORY_NOT_FOUND 或 FILE_TYPE_MISMATCH。

      HbMiniProgramSDKError 当前运行快照缺少或未启用 filesystem 权限时分别以 PERMISSION_NOT_IN_SNAPSHOT、PERMISSION_DENIED 拒绝;当前 Host 未开放 file.exists 时以 METHOD_FORBIDDEN 拒绝,旧 Runtime 也可能返回 METHOD_NOT_FOUND。

      HbMiniProgramSDKError picker / saveFile() 返回的精确外部授权被撤销、句柄 不属于当前 Runtime session 或 registry 已释放时,以 FILE_ACCESS_REVOKED 拒绝,而不是返回 false;SDK 已销毁或 Runtime 已卸载时分别以 SDK_DESTROYED、RUNTIME_UNAVAILABLE 拒绝。

      HbMiniProgramSDKError Host 拒绝访问、stat 探测失败、返回非布尔 bridge 结果 或发生其他文件 I/O 失败时,以 FILE_ACCESS_DENIED、FILE_IO_FAILED 或对应 SDK / bridge 错误拒绝。调用方不应把所有异常都解释为“不存在”。

      这是只读查询,不创建文件、不读取内容、不修改访问模式,也不要求可信用户手势。 mode: 'read' 与 mode: 'readwrite' 的 FileHandle 均可调用;但成功返回 true 不会 授予写权限,后续 create()、写入或删除仍受当前 mode、来源和 Host operation 限制。

      Runtime 使用 Host 的文件状态原语完成检查,但该布尔结果不是 stat() 的缓存或替代品,也不包含大小与时间戳。它只描述本次探测时的状态:目标可能在 resolve 后 被删除、替换或撤销授权,因此后续 readText()、stat() 或写入仍可能失败;不要用 exists() 作为权限检查或消除并发竞态。

      对 sandbox lazy proxy,返回 false 后可在 readwrite 模式下调用 create() 显式确保文件存在;缺失父目录时由 create({ recursive: true }) 决定是否一并创建。对 picker / saveFile() 的精确外部 FileHandle,授权失效属于错误,不等价于 文件不存在。若要检查目录,应使用 DirectoryHandle.exists(), 目录位于当前文件代理对应位置时本方法返回 false。

      新 PC Host 支持该操作;Android / iOS 1.3.396+ 仅在 system.describe 宣告 files.stat 时逐项启用,OHOS 同样以 Host 实际协商结果为准。Web、Browser Dev Host、旧 Host 或缺少该 operation 的环境会 fail closed,不提供浏览器 File / Blob 或内存 fallback;页面应 处理 METHOD_FORBIDDEN,不要仅按操作系统推断可用性。

      import hbSDK, { HbMiniProgramSDKError } from '@heybox/hb-sdk'

      const report = hbSDK.files.sandbox.file('reports/latest.json')

      try {
      if (!(await report.exists())) {
      await report.create({ recursive: true })
      await report.writeText('{}')
      }

      // exists() 之后状态仍可能变化,实际读取错误仍需处理。
      console.log(await report.readText())
      } catch (error) {
      if (error instanceof HbMiniProgramSDKError && error.code === 'METHOD_FORBIDDEN') {
      showFilesUnsupported()
      } else {
      throw error
      }
      }

      0.8.0

      android

      ios

      ohos

      windows

      macos

      android numeric-dot >= 1.3.396

      ios numeric-dot >= 1.3.396

      ohos none

      windows none

      macos none

    • 将完整文件读取为新的字节数组。

      返回 Promise<Uint8Array<ArrayBufferLike>>

      包含完整文件原始字节的新 Uint8Array。空文件返回长度为 0 的数组。Runtime 会先 复制 Host 字节,SDK 验证 bridge 结果后再创建当前可见区间的副本,因此返回值不与 Host / bridge 响应共享可变存储;修改数组只改变调用方的本地副本,不会写回文件。

      HbMiniProgramSDKError 目标或祖先不存在时返回 FILE_NOT_FOUND / DIRECTORY_NOT_FOUND, 目标类型不匹配时返回 FILE_TYPE_MISMATCH。Android / iOS 当前对一次完整读取设 8 MiB (8 * 1024 * 1024 bytes)上限,超限时返回 FILE_TOO_LARGE。

      HbMiniProgramSDKError 使用普通 sandbox / picker / saveFile() 句柄时,运行快照缺少或未启用 filesystem 时返回 PERMISSION_NOT_IN_SNAPSHOT / PERMISSION_DENIED;Host 未开放或未协商到 file.readBytes 时返回 METHOD_FORBIDDEN,旧 Runtime 可返回 METHOD_NOT_FOUND。

      HbMiniProgramSDKError 外部 direct handle 被撤销、不属于当前或已结束的 Runtime session 时返回 FILE_ACCESS_REVOKED;Host 拒绝底层授权时也可能返回 FILE_ACCESS_DENIED。 握手失败、SDK / Runtime 已终止或不可用、调用超时、Host 返回非字节结果或底层 I/O 失败时,返回 HANDSHAKE_FAILED、SDK_DESTROYED、RUNTIME_DESTROYED、RUNTIME_UNAVAILABLE、 REQUEST_TIMEOUT、FILE_IO_FAILED 或对应稳定文件错误码。

      该方法读取并缓冲整个文件,不提供 offset、range、stream、encoding、进度回调或 AbortSignal 参数。移动端 Host 可以在内部按 chunk 拉取,但公开 Promise 只在全部字节读取并复制完成后 resolve; 失败不会返回部分数组。8 MiB 是 Android / iOS 当前 Host 的原始文件字节上限,恰好等于上限允许; 新 PC Host 的限制由实际 Host I/O 合同决定。

      readBytes() 不解释内容格式:UTF-8 BOM、无效 UTF-8、NUL、压缩数据和图片头都会原样保留,也不会 因文本编码返回 FILE_ENCODING_INVALID。需要严格 UTF-8 字符串并移除前导 BOM 时使用 readText();需要把修改后的字节完整覆盖回文件时使用 writeBytes()。

      mode: 'read' 与 mode: 'readwrite' 句柄都可以读取,调用不需要可信用户手势,也不会弹出 picker、 创建文件、修改内容或延长外部授权寿命。picker / saveFile() 返回的 direct handle 只在当前 Runtime session 有效;sandbox lazy ref 会在每次调用时按当前 Mini-program identity 解析。 Companion attachments.open() 返回的只读 FileHandle 是受控例外:其 readBytes() 由 companion provenance 授权,不额外要求 filesystem,但仍受当前 Companion / Runtime session 生命周期约束。

      新 PC Host 支持该操作;Android / iOS 1.3.396+ 仅在 system.describe 同时宣告 files.openRead、files.read、files.release 时逐项启用,OHOS 同样以 Host 实际协商结果为准。 Web、Browser Dev Host 的普通 sandbox / picker 路径、旧 Host 或 operation 集不完整时 fail closed, 不提供浏览器 File / Blob、内存 fallback 或自动分段的公开 API;前述 Companion attachment 仍按 自身受控 provenance 判断。

      import hbSDK, { HbMiniProgramSDKError } from '@heybox/hb-sdk'

      const avatar = hbSDK.files.sandbox.file('avatar.png')

      try {
      const bytes = await avatar.readBytes()
      const isPng =
      bytes.length >= 4 &&
      bytes[0] === 0x89 &&
      bytes[1] === 0x50 &&
      bytes[2] === 0x4e &&
      bytes[3] === 0x47

      console.log({ isPng, size: bytes.byteLength })
      bytes[0] = 0 // 只修改本地副本,不会写回 avatar.png
      } catch (error) {
      if (error instanceof HbMiniProgramSDKError && error.code === 'FILE_TOO_LARGE') {
      console.warn('请改用业务分片格式,或避免把大文件一次读入内存')
      } else {
      throw error
      }
      }
    • 将完整文件按文本读取。

      返回 Promise<string>

      Runtime 将 Host 返回的完整字节序列按严格 UTF-8 解码后的字符串。空文件返回 ''; 换行、NUL 与其他合法 Unicode 内容保持不变。UTF-8 decoder 会剥离第一个开头 BOM;若解码结果 仍以 U+FEFF 开头,Runtime 再移除一个,因此一到两个连续前导 UTF-8 BOM 都不会出现在结果中。

      HbMiniProgramSDKError 文件不是合法 UTF-8 时返回 FILE_ENCODING_INVALID,不会用 replacement character 静默替换坏字节。需要无损读取任意二进制或保留 BOM 时使用 readBytes()。

      HbMiniProgramSDKError 目标或祖先不存在时返回 FILE_NOT_FOUND / DIRECTORY_NOT_FOUND, 目标类型不匹配时返回 FILE_TYPE_MISMATCH。Android/iOS 当前对一次完整读取设 8 MiB 上限, 超限时返回 FILE_TOO_LARGE。

      HbMiniProgramSDKError 使用普通 sandbox / picker / saveFile() 句柄时,运行快照缺少或未启用 filesystem 时返回 PERMISSION_NOT_IN_SNAPSHOT / PERMISSION_DENIED;Host 未开放或未协商到 file.readText 时返回 METHOD_FORBIDDEN,旧 Runtime 可返回 METHOD_NOT_FOUND。

      HbMiniProgramSDKError 外部 direct handle 已失效、来自其他或已结束的 Runtime session 时返回 FILE_ACCESS_REVOKED;SDK / Runtime 已终止、调用超时、Host 返回无效内容或底层 I/O 失败时返回 SDK_DESTROYED、RUNTIME_DESTROYED、REQUEST_TIMEOUT 或 FILE_IO_FAILED 等 对应 SDK 错误。

      该方法读取并缓冲整个文件,没有 offset、range、stream、encoding 或 AbortSignal 参数。移动端 Host 可以在内部按 chunk 读取,但公开 Promise 只在全部字节读取、复制和 UTF-8 解码完成后 resolve; 读取失败不会返回部分文本。8 MiB 是 Android/iOS 当前 Host 的原始文件字节上限,不是 JavaScript 字符串长度限制;新 PC Host 的限制由实际 Host I/O 合同决定。

      mode: 'read' 与 mode: 'readwrite' 句柄都可以读取,调用不需要可信用户手势,也不会弹出 picker、 创建文件、修改内容或延长外部授权寿命。picker / saveFile() 返回的 direct handle 只在当前 Runtime session 有效;sandbox lazy ref 会在每次调用时按当前 Mini-program identity 解析。 Companion attachments.open() 返回的只读 FileHandle 是受控例外:其 readText() 由 companion provenance 授权,不额外要求 filesystem,但仍受当前 Companion / Runtime session 生命周期约束。

      writeText() 执行相反方向的完整 UTF-8 编码与覆盖写入;它不会添加 BOM, 且要求 mode === 'readwrite'。若内容可能不是文本,或业务需要区分 BOM 和文件正文,应使用 readBytes() 获取原始字节并自行解析。

      import hbSDK, { HbMiniProgramSDKError } from '@heybox/hb-sdk'

      const settings = hbSDK.files.sandbox.file('settings.json')

      try {
      const text = await settings.readText()
      const value = JSON.parse(text)
      console.log(value)
      } catch (error) {
      if (error instanceof HbMiniProgramSDKError && error.code === 'FILE_ENCODING_INVALID') {
      // readBytes() 保留原始字节和 BOM,可交给业务自己的格式解析器。
      const bytes = await settings.readBytes()
      console.warn('settings.json 不是 UTF-8', bytes)
      } else if (error instanceof HbMiniProgramSDKError && error.code === 'FILE_NOT_FOUND') {
      await settings.writeText('{}')
      } else {
      throw error
      }
      }
    • 删除当前代理指向的 sandbox 文件。

      返回 Promise<void>

      Host 完成删除后以 undefined resolve;当前 FileHandle 代理本身仍可复用,后续可用 exists() 确认目标已不存在,或用 create() 在同一位置重新创建文件。

      HbMiniProgramSDKError 代理为只读,或来源是 pickFiles()、saveFile()、外部 Directory 派生项/枚举项时返回 FILE_ACCESS_DENIED;外部授权即使为 readwrite 也不能删除。

      HbMiniProgramSDKError 目标或祖先不存在时返回 FILE_NOT_FOUND / DIRECTORY_NOT_FOUND,目标实际是目录时可返回 FILE_TYPE_MISMATCH;授权失效或 Host 删除失败 时返回 FILE_ACCESS_REVOKED / FILE_IO_FAILED 等稳定文件错误码。

      HbMiniProgramSDKError 当前运行快照缺少或未启用 filesystem 时返回 PERMISSION_NOT_IN_SNAPSHOT / PERMISSION_DENIED;Host 未开放 file.remove operation 时返回 METHOD_FORBIDDEN,旧 Runtime 不认识该 method 时可返回 METHOD_NOT_FOUND。

      该方法只删除一个文件,不接受参数,也不删除目录。可删除对象必须同时来自当前 Mini-program 的 sandbox 且为 readwrite;files.sandbox.file() 和 sandbox 目录的 list() 结果满足来源约束。若目标是目录,使用 DirectoryHandle.remove;删除非空目录还需显式 传入 { recursive: true }。

      remove() 不会先调用 exists(),也不是幂等的“确保不存在”操作:lazy sandbox 代理可以在 文件尚不存在时构造,此时调用删除会按 Host 结果抛出缺失错误。即使先由 exists() 返回 true,目标仍可能在两次异步调用之间变化,因此仍应处理 FILE_NOT_FOUND / DIRECTORY_NOT_FOUND。调用不要求可信用户手势,也不占用外部 direct-handle 配额。

      新 PC Host 支持该操作;Android/iOS 1.3.396+ 和 OHOS 仍以启动时 system.describe 宣告的 files.remove operation 为准。Web、Browser Dev Host、旧 Host 或 operation 缺失时 fail closed,不提供浏览器文件系统或内存 fallback。

      import hbSDK from '@heybox/hb-sdk'

      const draft = hbSDK.files.sandbox.file('draft.txt')
      await draft.writeText('temporary')

      if (await draft.exists()) {
      await draft.remove()
      }
      console.log(await draft.exists()) // false

      // 代理仍表示同一个 sandbox 位置,可以重新创建。
      await draft.create()
    • 读取当前文件的元数据快照。

      返回 Promise<FileStat>

      新建的 FileStat 对象:kind 固定为 'file',size 是 0 到 Number.MAX_SAFE_INTEGER 的整数;Host 提供时还包含相互独立、非负有限数值的 modifiedAt / createdAt。返回对象不是 FileHandle,也不会包含真实路径、内容或 Host 的额外字段。

      HbMiniProgramSDKError 目标文件或任一祖先不存在时返回 FILE_NOT_FOUND / DIRECTORY_NOT_FOUND;目标实际是目录、direct handle 类型不匹配时返回 FILE_TYPE_MISMATCH。

      HbMiniProgramSDKError 外部 direct handle 已撤销、不属于当前 Runtime session 或 registry 已释放时返回 FILE_ACCESS_REVOKED;Host 拒绝读取元数据时返回 FILE_ACCESS_DENIED。

      HbMiniProgramSDKError 使用普通 FileHandle 时,运行快照缺少或未启用 filesystem 时返回 PERMISSION_NOT_IN_SNAPSHOT / PERMISSION_DENIED;Host 未开放或未协商到 file.stat 时返回 METHOD_FORBIDDEN,旧 Runtime 可返回 METHOD_NOT_FOUND。Companion attachment 是受控例外: 它使用已启用的 companion 授权读取自身元数据,不要求另行声明 filesystem。

      HbMiniProgramSDKError Host 返回非对象、错误的 kind,负数/小数/unsafe size, 或负数、非有限数值的时间戳时返回 FILE_IO_FAILED;未知 Host 错误和无法识别的响应同样规范为 FILE_IO_FAILED。SDK 已销毁、Runtime 已卸载或请求超时时还可能返回 SDK_DESTROYED、 RUNTIME_UNAVAILABLE、REQUEST_TIMEOUT。

      这是只读操作,mode: 'read' 与 mode: 'readwrite' 均可调用,不要求可信用户手势,也不会读取 文件内容、创建文件、更新时间戳或占用新的 direct-handle 配额。Runtime 会重新校验 ref 的类型、 当前 session/provenance 与 Mini-program identity;通过结构校验不等于可以跨 session 复用句柄。

      每次调用都会发送新的 file.stat 请求,并返回与 Host 响应分离的新对象;SDK 不缓存、冻结或持续 更新该对象。修改返回对象不会影响文件或后续结果,文件也可能在 Promise resolve 后立即被外部进程 修改、替换或删除。因此它只描述本次 Host 查询的快照,不能与之前的 exists() 或之后的 readText() / readBytes() 组成原子检查。

      size 的公开约定单位是 byte,modifiedAt / createdAt 的公开约定单位是 Unix epoch milliseconds;但 Runtime 只能验证数值结构,不能证明 Host 使用了正确单位、时间来自文件系统或 size 与稍后读取的内容仍一致。时间戳可分别缺失,也不要求为整数/safe integer、落在 JavaScript Date 可表示范围内、createdAt <= modifiedAt 或不晚于当前时间;用于排序和日期展示前应按业务范围 继续校验。

      与 exists() 不同,stat() 不会把缺失祖先、缺失目标或 kind mismatch 归一为 false,而会以对应错误拒绝。与 readText() / readBytes() 不同,它只读取元数据,不传输文件 body;Android/iOS 的 8 MiB 单次完整内容读写上限不限制可报告的 size,但 size 仍不能超过 Number.MAX_SAFE_INTEGER。

      新 PC Host 支持该 operation;Android/iOS 1.3.396+ 仅在 system.describe 宣告 files.stat 时逐项启用,OHOS 同样以 Host 实际协商结果为准。Web、Browser Dev Host、旧 Host 或缺少该 operation 的环境会 fail closed,不提供浏览器 File / Blob 或内存 fallback。

      import hbSDK, { HbMiniProgramSDKError } from '@heybox/hb-sdk'

      const report = hbSDK.files.sandbox.file('reports/latest.json')

      // exists() 只用于快速分支;文件仍可能在下一次异步调用前变化。
      if (await report.exists()) {
      try {
      const stat = await report.stat()
      console.log(`${stat.size} bytes`)

      if (stat.modifiedAt !== undefined) {
      const modifiedAt = new Date(stat.modifiedAt)
      if (!Number.isNaN(modifiedAt.getTime())) console.log(modifiedAt.toISOString())
      }
      } catch (error) {
      if (!(error instanceof HbMiniProgramSDKError) || error.code !== 'FILE_NOT_FOUND') throw error
      }
      }

      0.8.0

      android

      ios

      ohos

      windows

      macos

      android numeric-dot >= 1.3.396

      ios numeric-dot >= 1.3.396

      ohos none

      windows none

      macos none

    • 将原始字节完整写入文件。

      参数

      • content: Uint8Array

        要写入的 Uint8Array。SDK 在调用时只复制该 view 的当前可见字节区间;不会把 byteOffset 之前或 byteLength 之后的 backing ArrayBuffer 内容一并写入。调用返回 Promise 后 再修改原数组不会改变本次写入。空数组合法,会把目标替换为零字节文件。

      返回 Promise<void>

      SDK 与 Runtime 完成输入复制且 Host 的完整写入请求成功后以 undefined resolve。移动端 会等待最后一个带 EOF 的 chunk 获得 Host 响应;该时点不返回写入字节数、文件元数据或新的 FileHandle,也不承诺操作系统已执行物理 fsync。

      HbMiniProgramSDKError content 不是 Uint8Array,或其 backing buffer 是 SharedArrayBuffer 时,在发送 bridge 请求前返回 INVALID_PARAMS;当前代理不是 readwrite 时在输入复制和 Host I/O 前返回 FILE_ACCESS_DENIED。

      HbMiniProgramSDKError 当前运行快照缺少或未启用 filesystem 权限时返回 PERMISSION_NOT_IN_SNAPSHOT / PERMISSION_DENIED;Host 未开放或未协商到 file.writeBytes 时返回 METHOD_FORBIDDEN,旧 Runtime 可返回 METHOD_NOT_FOUND。

      HbMiniProgramSDKError 缺失父目录时返回 DIRECTORY_NOT_FOUND,路径中的祖先或 目标类型不匹配时返回 FILE_TYPE_MISMATCH。Android / iOS 对一次完整写入设 8 MiB 上限;当前 view 的 byteLength 超过 8 * 1024 * 1024 时返回 FILE_TOO_LARGE。

      HbMiniProgramSDKError 外部 direct handle 被撤销、不属于当前 Runtime session 或 registry 已释放时返回 FILE_ACCESS_REVOKED;SDK 已销毁、Runtime 已卸载、请求超时、Host 响应 异常或底层 I/O 失败时,返回 SDK_DESTROYED、RUNTIME_UNAVAILABLE、REQUEST_TIMEOUT、 FILE_IO_FAILED 或对应稳定文件错误码。

      SDK 会在调用同步阶段执行第一次防御性复制,Runtime 收到 payload 后再复制一次,再把独立的 Uint8Array 交给 Host。因此本次写入只观察调用时 view 中的字节,不与调用方继续共享可变 ArrayBuffer。SharedArrayBuffer backing 会被明确拒绝,不能借此建立跨 bridge 共享内存。

      这是完整文件写入,不是 append、range write 或 stream:已有内容会被本次字节序列整体替换, 写入空数组会截断为零字节。若 Host 在写入中途失败,Promise 会拒绝;公开合同不承诺失败时 回滚旧内容或提供跨进程原子替换,需要事务语义时应由业务使用临时文件和自己的提交协议。

      目标文件不存在时可以隐式创建,但父目录必须已经存在,writeBytes() 不会递归创建目录。 需要创建父目录时先调用 DirectoryHandle.create(),或对文件调用 create({ recursive: true })。不必先用 exists() 检查文件;该检查也不能消除两次异步调用之间 的状态竞态,实际写入错误仍应处理。

      sandbox lazy FileHandle 固定继承 readwrite。pickFiles({ mode: 'readwrite' })、 pickDirectory({ mode: 'readwrite' }) 的派生文件和 saveFile() 返回的精确外部 FileHandle 也可 写入,但 direct handle 只在当前 Runtime session 有效,且授权范围不会扩张。只读 picker 结果 和 Companion attachment 返回 FILE_ACCESS_DENIED。该方法不需要新的 可信用户手势;只有最初取得外部授权的 picker / saveFile() 需要手势。

      新 PC Host 支持该操作;Android / iOS 1.3.396+ 仅在 system.describe 同时宣告 files.openWrite、files.write、files.release 时逐项启用,OHOS 同样以 Host 实际协商结果 为准。Web、Browser Dev Host、旧 Host 或 operation 集不完整时 fail closed,不提供浏览器 File / Blob 或内存 fallback。新 PC Host 的大小限制由实际 Host 合同决定,不应套用移动端 8 MiB 上限。

      readBytes() 返回完整文件的独立字节副本; writeText() 则先把字符串编码成不带 BOM 的 UTF-8,再执行相同的 完整替换语义。需要检查写入后的最终大小或时间戳时,成功后另行调用 stat()。

      import hbSDK from '@heybox/hb-sdk'

      const file = hbSDK.files.sandbox.file('header.bin')
      const backing = new Uint8Array([0xff, 0x89, 0x50, 0x4e, 0x47, 0xff])
      const visible = backing.subarray(1, 5)

      const writing = file.writeBytes(visible)
      visible.fill(0) // 不影响 writeBytes() 已取得的快照。
      await writing

      console.log([...await file.readBytes()]) // [137, 80, 78, 71]
      await file.writeBytes(new Uint8Array()) // 完整替换为空文件。
    • 将字符串按 UTF-8 编码后完整写入文件。

      参数

      • content: string

        要写入的 JavaScript 字符串。必须确实是 string;SDK 不会对对象调用 String(),也不接受 Uint8Array、Blob、stream 或 encoding 选项。空字符串合法,会把目标 替换为空文件。需要精确控制原始字节时使用 writeBytes()。

      返回 Promise<void>

      Runtime 完成 UTF-8 编码且 Host 的完整写入请求成功后以 undefined resolve。移动端会 等待最后一个带 EOF 的 chunk 获得 Host 响应;该时点不返回写入字节数、文件元数据或新的 FileHandle,也不承诺操作系统已执行物理 fsync。

      HbMiniProgramSDKError content 不是字符串时在 Host I/O 前以 INVALID_PARAMS 拒绝;当前代理的 mode 不是 readwrite 时在发送 bridge 请求前以 FILE_ACCESS_DENIED 拒绝。

      HbMiniProgramSDKError 当前运行快照缺少或未启用 filesystem 权限时分别以 PERMISSION_NOT_IN_SNAPSHOT、PERMISSION_DENIED 拒绝;Host 未开放 file.writeText 时以 METHOD_FORBIDDEN 拒绝,旧 Runtime 也可能返回 METHOD_NOT_FOUND。

      HbMiniProgramSDKError 缺失父目录时返回 DIRECTORY_NOT_FOUND,路径中的祖先 或目标类型不匹配时返回 FILE_TYPE_MISMATCH。Android / iOS 对一次完整写入的 UTF-8 编码结果 设 8 MiB 上限,超过 8 * 1024 * 1024 bytes 时返回 FILE_TOO_LARGE;该限制按字节而不是 JavaScript 字符数计算。

      HbMiniProgramSDKError 外部 direct handle 被撤销、不属于当前 Runtime session 或 registry 已释放时返回 FILE_ACCESS_REVOKED;SDK 已销毁、Runtime 已卸载、请求超时、Host 响应异常或底层 I/O 失败时,分别以 SDK_DESTROYED、RUNTIME_UNAVAILABLE、 REQUEST_TIMEOUT、FILE_IO_FAILED 或对应稳定文件错误码拒绝。

      Runtime 使用标准 TextEncoder 把完整字符串编码为不带 BOM 的 UTF-8,再调用 Host 的完整文件 写原语。该方法不是 append、range write 或 stream:已有文件内容会被本次编码结果整体替换, 写入 '' 会把文件截断为零字节。若 Host 在写入中途失败,Promise 会拒绝;公开合同不承诺失败 时回滚旧内容或提供跨进程原子替换,需要事务语义时应由业务使用临时文件和自己的提交协议。

      目标文件本身不存在时可以隐式创建,因此通常不需要先调用 create();但父目录必须已经存在,writeText() 不会递归创建目录。 需要创建父目录时先调用 DirectoryHandle.create(),或对文件调用 create({ recursive: true })。不要用 exists() 后再写来消除竞态:目标可能在两次异步调用之间 变化,实际写入错误仍应处理。

      sandbox lazy FileHandle 固定继承 readwrite,并在每次调用时按当前 Mini-program identity 解析。 pickFiles({ mode: 'readwrite' })、pickDirectory({ mode: 'readwrite' }) 的派生文件和 saveFile() 返回的精确外部 FileHandle 也可以写入,但授权范围不会因此扩张;direct handle 只在 当前 Runtime session 有效。只读 picker 结果和 Companion attachment 会在本地 mode 检查时以 FILE_ACCESS_DENIED 拒绝。该方法不需要新的可信用户手势;只有最初 获取外部授权的 picker / saveFile() 需要手势。

      新 PC Host 支持该操作;Android / iOS 1.3.396+ 仅在 system.describe 同时宣告 files.openWrite、files.write、files.release 时逐项启用,OHOS 同样以 Host 实际协商结果为准。 Web、Browser Dev Host、旧 Host 或 operation 集不完整时 fail closed,不提供浏览器 File / Blob 或内存 fallback。新 PC Host 的大小限制由实际 Host 合同决定,不应套用移动端 8 MiB 上限。

      readText() 可按严格 UTF-8 读取完整内容,但会移除前导 BOM;写入后 仍可能因为外部修改、授权撤销或 Session 结束而读取失败。需要检查最终字节数或时间戳时,在 写入成功后另行调用 stat()。

      import hbSDK, { HbMiniProgramSDKError } from '@heybox/hb-sdk'

      const reports = hbSDK.files.sandbox.directory('reports')
      await reports.create({ recursive: true })

      const report = reports.file('latest.txt')
      await report.writeText('第一版\n') // 文件不存在时隐式创建。

      try {
      await report.writeText('第二版\n') // 完整替换,不会追加到第一版后面。
      console.log(await report.readText()) // 第二版
      } catch (error) {
      if (error instanceof HbMiniProgramSDKError && error.code === 'FILE_TOO_LARGE') {
      console.warn('文本的 UTF-8 编码结果超过当前平台上限')
      } else {
      throw error
      }
      }

      0.8.0

      android

      ios

      ohos

      windows

      macos

      android numeric-dot >= 1.3.396

      ios numeric-dot >= 1.3.396

      ohos none

      windows none

      macos none