StorageManager:getDirectory() 方法

基线 2023

新可用

2023 年 3 月起,此功能可在最新的设备和浏览器版本中使用。此功能可能无法在旧版设备或浏览器中使用。

安全上下文:此功能仅在安全上下文(HTTPS)中可用,在某些或所有支持的浏览器中可用。

注意:此功能在Web Workers中可用。

getDirectory() 方法是 StorageManager 接口的方法,用于获取对 FileSystemDirectoryHandle 对象的引用,该对象允许访问存储在源私有文件系统 (OPFS)中的目录及其内容。

语法

js
getDirectory()

参数

无。

返回值

一个 Promise,它会解析为一个 FileSystemDirectoryHandle 对象。

异常

SecurityError DOMException

如果用户代理无法将请求的目录映射到本地 OPFS,则会抛出此异常。

示例

以下异步事件处理程序函数包含在 Web Worker 中。在从主线程接收消息时,它会

  1. 使用 getDirectory() 获取表示 OPFS 根目录的 FileSystemDirectoryHandle,并将其存储在 root 变量中。
  2. 使用 FileSystemDirectoryHandle.getFileHandle() 获取文件句柄。
  3. 使用 FileSystemFileHandle.createSyncAccessHandle() 创建同步文件访问句柄。
  4. 获取文件的大小并创建一个 ArrayBuffer 来容纳它。
  5. 读取和写入文件。
  6. 将更改持久化到磁盘并关闭同步访问句柄。
js
onmessage = async (e) => {
  // Retrieve message sent to work from main script
  const message = e.data;

  // Get handle to draft file
  const root = await navigator.storage.getDirectory();
  const draftHandle = await root.getFileHandle("draft.txt", { create: true });
  // Get sync access handle
  const accessHandle = await draftHandle.createSyncAccessHandle();

  // Get size of the file.
  const fileSize = accessHandle.getSize();
  // Read file content to a buffer.
  const buffer = new DataView(new ArrayBuffer(fileSize));
  const readBuffer = accessHandle.read(buffer, { at: 0 });

  // Write the message to the end of the file.
  const encoder = new TextEncoder();
  const encodedMessage = encoder.encode(message);
  const writeBuffer = accessHandle.write(encodedMessage, { at: readBuffer });

  // Persist changes to disk.
  accessHandle.flush();

  // Always close FileSystemSyncAccessHandle if done.
  accessHandle.close();
};

注意:在规范的早期版本中,close()flush()getSize()truncate() 被错误地指定为异步方法,并且某些浏览器的旧版本以这种方式实现它们。但是,所有当前支持这些方法的浏览器都将它们实现为同步方法。

规范

规范
文件系统标准
# dom-storagemanager-getdirectory

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅