You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FileSystem Access API:如何获取已添加目录及目录列表?

解决方法:获取已选择的本地目录及列出已添加目录

为什么你的代码找不到目录?

showDirectoryPicker获取的是用户本地文件系统的目录句柄,而navigator.storage.getDirectory()访问的是浏览器专属的OPFS私有文件系统——这俩是完全独立的存储空间,所以你在OPFS里根本找不到之前选的本地目录,这不是代码错了,是找错地方了。

正确步骤:保存、恢复已选目录

1. 保存已获取的目录句柄

选完目录后,把它序列化后存在本地存储(推荐用localStorage快速存储,或IndexedDB存大量条目),示例代码:

try {
  // 先申请持久化存储权限,避免浏览器自动清除数据
  const isPersisted = await navigator.storage.persist();
  if (!isPersisted) {
    console.log("存储未持久化,数据可能会被浏览器清除");
  }

  const directoryHandle = await showDirectoryPicker({
    startIn: startIn.value,
  });

  // 序列化目录句柄
  const serializedHandle = await directoryHandle.serialize();
  // 以目录名为标识,存在localStorage中
  localStorage.setItem(`saved-dir-${directoryHandle.name}`, JSON.stringify(serializedHandle));

  // 原有的目录内容遍历逻辑
  for await (const [name, fileHandle] of directoryHandle) {
    directory.textContent += `${name} - ${fileHandle.kind}\n`;
  }
} catch (e) {
  console.log(e);
}

2. 恢复已保存的目录句柄

之后需要重新获取该目录时,从存储中取出序列化数据反序列化即可:

try {
  // 替换成你保存时用的目录名标识
  const serializedStr = localStorage.getItem(`saved-dir-目标目录名`);
  if (!serializedStr) {
    console.log("没有找到已保存的目录");
    return;
  }

  const serializedHandle = JSON.parse(serializedStr);
  // 反序列化恢复目录句柄
  const existingDirectoryHandle = await FileSystemDirectoryHandle.deserialize(serializedHandle);

  // 恢复后即可正常操作目录,比如遍历内容
  for await (const [name, fileHandle] of existingDirectoryHandle) {
    console.log(`${name} - ${fileHandle.kind}`);
  }
} catch (e) {
  console.log(e);
}

列出所有已添加的目录

遍历localStorage中所有以saved-dir-开头的存储条目,逐个恢复并列出:

async function listSavedDirectories() {
  const savedDirs = [];
  for (let i = 0; i < localStorage.length; i++) {
    const key = localStorage.key(i);
    if (key.startsWith('saved-dir-')) {
      const serializedStr = localStorage.getItem(key);
      const serializedHandle = JSON.parse(serializedStr);
      const dirHandle = await FileSystemDirectoryHandle.deserialize(serializedHandle);
      savedDirs.push({
        name: dirHandle.name,
        handle: dirHandle
      });
    }
  }

  // 输出所有已保存的目录
  console.log("已添加的目录列表:");
  savedDirs.forEach(dir => console.log(dir.name));
  return savedDirs;
}

// 调用函数获取列表
listSavedDirectories();

注意事项

  • 如果用户撤销了网站对该目录的访问权限,反序列化时会抛出错误,需要捕获并提示用户重新选择目录。
  • 只要用户不清除浏览器数据、不撤销权限,序列化的目录句柄可以长期使用。

内容的提问来源于stack exchange,提问作者Sergey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 09:57:59