DirectoryReaderSync

非标准:此特性未标准化。我们不建议在生产环境中使用非标准特性,因为它们浏览器支持有限,并且可能会更改或被移除。但是,在没有标准选项的特定情况下,它们可以是合适的替代方案。

已弃用:此特性不再推荐。虽然某些浏览器可能仍然支持它,但它可能已经从相关的网络标准中删除,可能正在删除过程中,或者可能仅为兼容性目的而保留。请避免使用它,如果可能,请更新现有代码;请参阅本页底部的兼容性表格以指导您的决策。请注意,此特性可能随时停止工作。

DirectoryReaderSync 接口允许您读取目录中的条目。

警告:此接口已弃用,不再是标准规范的一部分。请勿再使用它。请改用 File and Directory Entries API

基本概念

在调用此接口的唯一方法 readEntries() 之前,请先创建 DirectoryEntrySync 对象。但是,DirectoryEntrySync(以及 FileEntrySync)不是可以在调用应用程序和 Web Worker 线程之间传递的数据类型。这并不是什么大问题,因为您并不真正需要主应用程序和 worker 线程看到相同的 JavaScript 对象;您只需要它们能够访问相同的文件。您可以通过传递一组 filesystem: URL(这些只是字符串)而不是一组条目来做到这一点。您也可以使用 filesystem: URL 通过 resolveLocalFileSystemURL() 来查找条目。这会将您带回到 DirectoryEntrySync(以及 FileEntrySync)对象。

示例

在以下来自 HTML5Rocks (web.dev) 的代码片段中,我们创建了 Web Workers,并将数据从其中传递到主应用程序。

js
// Taking care of the browser-specific prefixes.
window.resolveLocalFileSystemURL =
  window.resolveLocalFileSystemURL || window.webkitResolveLocalFileSystemURL;

// Create web workers
const worker = new Worker("worker.js");
worker.onmessage = (e) => {
  const urls = e.data.entries;
  urls.forEach((url) => {
    window.resolveLocalFileSystemURL(url, (fileEntry) => {
      // Print out file's name.
      console.log(fileEntry.name);
    });
  });
};

worker.postMessage({ cmd: "list" });

以下是获取目录内容的 worker.js 代码。

js
// worker.js

// Taking care of the browser-specific prefixes.
self.requestFileSystemSync =
  self.webkitRequestFileSystemSync || self.requestFileSystemSync;

// Global for holding the list of entry file system URLs.
const paths = [];

function getAllEntries(dirReader) {
  const entries = dirReader.readEntries();

  for (const entry of entries) {
    // Stash this entry's filesystem in URL
    paths.push(entry.toURL());

    // If this is a directory, traverse.
    if (entry.isDirectory) {
      getAllEntries(entry.createReader());
    }
  }
}

// Forward the error to main app.
function onError(e) {
  postMessage(`ERROR: ${e.toString()}`);
}

self.onmessage = (e) => {
  const cmd = e.data.cmd;

  // Ignore everything else except our 'list' command.
  if (!cmd || cmd !== "list") {
    return;
  }

  try {
    const fs = requestFileSystemSync(TEMPORARY, 1024 * 1024 /* 1MB */);

    getAllEntries(fs.root.createReader());

    self.postMessage({ entries: paths });
  } catch (e) {
    onError(e);
  }
};

方法

readEntries()

返回特定目录的条目列表。重复调用此方法,直到返回空数组为止。

语法

js
readEntries()
参数

无。

返回值

包含 FileEntrySyncDirectoryEntrySync 的数组。

异常

此方法可以引发具有以下代码的 DOMException

异常 描述
NOT_FOUND_ERR 目录不存在。
INVALID_STATE_ERR 自首次调用 readEntries 处理以来,目录已被修改。
SECURITY_ERR 浏览器确定查找元数据不安全。

规范

此功能不再是任何规范的一部分。它已不再有望成为标准。

浏览器兼容性

另见