FileSystemDirectoryHandle

Baseline 已广泛支持

此功能已成熟,并可在许多设备和浏览器版本上运行。自 2023 年 3 月以来,它已在各种浏览器中可用。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

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

FileSystemDirectoryHandle 接口是 文件系统 API 的一部分,它提供了对文件系统目录的句柄。

该接口可以通过 window.showDirectoryPicker()StorageManager.getDirectory()DataTransferItem.getAsFileSystemHandle()FileSystemDirectoryHandle.getDirectoryHandle() 方法访问。

FileSystemHandle FileSystemDirectoryHandle

实例属性

继承其父级 FileSystemHandle 的属性。

实例方法

继承其父级 FileSystemHandle 的方法。

常规方法

FileSystemDirectoryHandle.getDirectoryHandle()

返回一个 Promise,该 Promise 会被一个 FileSystemDirectoryHandle 兑现,该 FileSystemDirectoryHandle 代表在调用该方法的目录句柄内具有指定名称的子目录。

FileSystemDirectoryHandle.getFileHandle()

返回一个 Promise,该 Promise 会被一个 FileSystemFileHandle 兑现,该 FileSystemFileHandle 代表在调用该方法的目录内具有指定名称的文件。

FileSystemDirectoryHandle.removeEntry()

如果目录句柄包含名为指定名称的文件或目录,则尝试异步删除该条目。

FileSystemDirectoryHandle.resolve()

返回一个 Promise,该 Promise 会被一个 Array 兑现,该数组包含从父句柄到指定子条目的目录名称,其中子条目的名称是最后一个数组项。

异步迭代器方法

FileSystemDirectoryHandle.entries()

返回给定对象自身可枚举属性的 `[key, value]` 对的新的异步迭代器

FileSystemDirectoryHandle.keys()

返回一个包含 FileSystemDirectoryHandle 中每个条目键的新异步迭代器

FileSystemDirectoryHandle.values()

返回一个包含 FileSystemDirectoryHandle 对象中每个索引值的新的异步迭代器

FileSystemDirectoryHandle[Symbol.asyncIterator]()

返回给定对象自身可枚举属性的 `[key, value]` 对的新的异步迭代器

示例

返回目录句柄

以下示例返回一个具有指定名称的目录句柄;如果目录不存在,则会创建它。

js
const dirName = "directoryToGetName";

// assuming we have a directory handle: 'currentDirHandle'
const subDir = await currentDirHandle.getDirectoryHandle(dirName, {
  create: true,
});

返回文件路径

以下异步函数使用 resolve() 方法查找相对于指定目录句柄的选定文件的路径。

js
async function returnPathDirectories(directoryHandle) {
  // Get a file handle by showing a file picker:
  const handle = await self.showOpenFilePicker();
  if (!handle) {
    // User cancelled, or otherwise failed to open a file.
    return;
  }

  // Check if handle exists inside our directory handle
  const relativePaths = await directoryHandle.resolve(handle);

  if (relativePath === null) {
    // Not inside directory handle
  } else {
    // relativePath is an array of names, giving the relative path

    for (const name of relativePaths) {
      // log each entry
      console.log(name);
    }
  }
}

返回目录中所有文件的句柄

以下示例递归地扫描目录,返回该目录中每个文件的 FileSystemFileHandle 对象。

js
async function* getFilesRecursively(entry) {
  if (entry.kind === "file") {
    const file = await entry.getFile();
    if (file !== null) {
      file.relativePath = getRelativePath(entry);
      yield file;
    }
  } else if (entry.kind === "directory") {
    for await (const handle of entry.values()) {
      yield* getFilesRecursively(handle);
    }
  }
}
for await (const fileHandle of getFilesRecursively(directoryHandle)) {
  console.log(fileHandle);
}

规范

规范
文件系统
# api-filesystemdirectoryhandle

浏览器兼容性

另见