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

    方法 pickDirectory

    • 让用户选择目录并返回当前 session 的授权代理。

      参数

      返回 Promise<DirectoryHandle>

      用户选中的冻结 DirectoryHandle direct proxy。kind 固定为 'directory',name 是安全 basename,mode 与请求模式一致;不包含真实路径。取消会抛错, 不返回 undefined。

      HbMiniProgramSDKError options 或 mode 非法时返回 INVALID_PARAMS;缺少当前 可信用户手势时返回 USER_GESTURE_REQUIRED;用户取消系统选择器时返回 FILE_PICKER_CANCELLED。

      HbMiniProgramSDKError 当前运行快照缺少或未启用 filesystem 时返回 PERMISSION_NOT_IN_SNAPSHOT / PERMISSION_DENIED;Host 未开放/未协商到 files.external 时返回 METHOD_FORBIDDEN,旧 Runtime 可返回 METHOD_NOT_FOUND;请求的 readwrite 未获 Host 授予时返回 FILE_ACCESS_DENIED。

      HbMiniProgramSDKError 当前 session 的外部 direct handle 达到 1024 上限时返回 FILE_QUOTA_EXCEEDED;授权在完成前失效、Host 结果非法/mode 不匹配或其他 picker/I/O 失败时 返回 FILE_ACCESS_REVOKED 或 FILE_IO_FAILED 等稳定文件错误码。

      必须直接从按钮点击等可信用户操作调用。不要先 await 握手或其他异步任务;应提前通过 getHandshakeState() / onHandshakeStateChange() 控制按钮只在 ready 时可用,再在点击回调 中立即调用 picker。取消是正常用户结果,应按 FILE_PICKER_CANCELLED 结束当前流程。 选择器等待不设固定超时;用户确认、取消或当前 SDK / Runtime 会话结束后才结束操作。

      默认授权模式为 read。返回的是用户选择范围的精确外部目录授权,只在当前 Runtime session 有效;session 结束或授权撤销后不能恢复或持久化复用。其 file() / directory() 派生项及 list() 结果继承 mode、不能提升权限,也不会继续占用 direct handle 配额。 readwrite 允许在授权目录内创建/写入以及作为 network.download() target,但外部目录及 其后代仍不能删除。

      单个 Runtime session 最多保留 1024 个 picker / saveFile() direct handles;每次成功的 pickDirectory() 占用一个。它与 sandbox 的逻辑代理不同: files.sandbox.directory 不打开选择器、无需用户手势、持久按 Mini-program 隔离,也不占用该 direct-handle 配额。

      鸿蒙手机和平板的单目录选择需要系统 API 26.0.0 或以上;较早系统需具备 SystemCapability.FileManagement.UserFileService.FolderSelection 能力。 同时要求当前客户端已适配并开放目录选择,不支持时抛出 METHOD_FORBIDDEN。 不具备上述能力的 API 24 鸿蒙手机无法选择外部目录,声明 filesystem 或升级编译 SDK 不会解除限制。单文件读写或导出可分别使用 pickFiles()、saveFile(),不授予父目录权限。

      新 PC Host 支持目录选择;Android/iOS 需要 1.3.396+,移动端继续以 system.describe 实际声明的 operation 为准;OHOS 同样按 Host 宣告能力启用。Web、Browser Dev Host、旧 Host 或 operation 集不完整时 fail closed,不提供 Blob/内存 fallback。页面代码不应按操作系统 猜测可用性,应处理 METHOD_FORBIDDEN。

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

      const chooseDirectoryButton = document.querySelector<HTMLButtonElement>('#choose-directory')!

      chooseDirectoryButton.addEventListener('click', async () => {
      try {
      const directory = await hbSDK.files.pickDirectory({ mode: 'readwrite' })
      console.log(directory.kind, directory.name, directory.mode)
      await directory.file('report.txt').writeText('done')
      } catch (error) {
      if (error instanceof HbMiniProgramSDKError && error.code === 'FILE_PICKER_CANCELLED') return
      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