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

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

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

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


源私有文件系统

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


浏览器支持

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

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

文件系统 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/