结合原始私有文件系统的文件系统API - WebKit

作者:API传播员 · 2025-11-05 · 阅读时间:4分钟

应用程序与本地文件交互是非常常见的需求。例如,用户通常需要打开文件、进行修改并保存文件。然而,对于 Web 应用程序来说,这种操作可能会变得复杂。虽然可以通过 IndexedDB API、具有“文件”类型的 HTML 输入元素或带有“下载”属性的 HTML 锚点元素来模拟文件操作,但这些方法需要对相关标准有深入的理解,并且需要精心设计以确保良好的用户体验。此外,对于频繁的文件操作或处理大文件,这些方法的性能可能并不理想。

文件系统 API 的出现,为 Web 应用程序提供了一种轻松高效的文件访问方式。它允许开发者直接创建、打开、读取和写入文件,同时支持创建目录并枚举其内容。


源私有文件系统

在不同浏览器的实现中,源私有文件系统中的条目未必直接映射到用户的本地文件系统。例如,这些条目可能是存储在某个数据库中的对象。这意味着通过文件系统 API 创建的文件或目录可能无法轻松地从浏览器外部访问。


浏览器支持

文件系统 API 的支持情况因浏览器和操作系统版本而异。例如:

  • macOS 12.2 及以上版本支持文件系统 API。
  • 在 macOS 12.4 和 iOS 15.4 的 Safari 浏览器中,引入了 FileSystemFileHandle 的 getFile() 方法。

文件系统 API 接口

WebKit 当前支持文件系统标准中的以下四个接口:

  • FileSystemHandle:表示文件系统中的一个条目。
  • FileSystemDirectoryHandle:用于操作目录。
  • FileSystemFileHandle:用于操作文件。
  • FileSystemSyncAccessHandle:支持同步文件读写操作。

接下来,我们通过一些示例来了解如何使用这些接口。


示例

访问源私有文件系统

开发者可以通过文件系统 API 访问源私有文件系统中的条目,从而实现文件的读取和写入操作。

创建目录或文件

通过类似根目录的 FileSystemDirectoryHandle 对象,可以使用 getDirectoryHandle() 和 getFileHandle() 方法访问具有特定名称的子目录或文件。

移动或重命名目录或文件

文件系统 API 支持对目录或文件进行移动或重命名操作,这为文件管理提供了更大的灵活性。

解析从目录条目到其后代的路径

要确定某个 FileSystemHandle 是否是现有 FileSystemDirectoryHandle 的后代,并获取它们的相对路径,可以使用 resolve() 方法。该方法返回一个数组,其中包含路径的各个组件名称。

枚举目录中的内容

如果开发者不知道目标文件或目录的名称,可以通过 keys()、values() 和 entries() 方法返回的异步迭代器枚举目录内容,从而获取所有子条目。

删除目录或文件

使用 FileSystemDirectoryHandle 对象,可以通过 removeEntry() 方法按名称删除子条目。

读取文件

文件系统 API 提供了多种方法来读取文件内容,包括异步和同步操作,以满足不同的性能需求。

在工作线程中读写文件

与返回 Promise 的 getFile() 方法不同,read() 方法是同步的,因此性能更高。如果需要实现高效的文件访问,可以使用 FileSystemSyncAccessHandle。例如:

  • 使用 FileSystemSyncAccessHandle 的同步 write() 方法写入文件。
  • 为了实现同步读写操作,FileSystemSyncAccessHandle 必须对文件条目具有独占访问权限。如果之前的 FileSystemSyncAccessHandle 未正确关闭,则无法在同一条目上创建新的 FileSystemSyncAccessHandle。

总结

如果您的 Web 应用程序需要与文件进行交互,建议尝试新的文件系统 API。它提供了类似于本地文件系统 API 的接口,并且性能经过优化,能够满足频繁文件操作和大文件处理的需求。

原文链接: https://webkit.org/blog/12257/the-file-system-access-api-with-origin-private-file-system/