如何在Web应用重新加载后检查FileSystemDirectoryHandle对应的磁盘目录是否存在?
如何检查FileSystemDirectoryHandle对应的目录是否存在
确实,Web File System Access API不像Node.js的fs模块那样提供直接的exists或access方法来预检查文件/目录是否存在。不过我们可以通过执行一个轻量、无副作用的操作,并捕获特定错误来实现类似的检查逻辑。
核心思路是:如果目录不存在,任何尝试访问它的操作都会抛出NotFoundError。我们可以选择一个不会修改目录内容的操作来触发这个错误,从而判断目录是否还存在。
推荐的两种实现方式:
方法1:尝试获取当前目录句柄
调用getDirectoryHandle获取当前目录(用.作为路径),并设置create: false(不创建新目录)。如果目录不存在,这个调用会直接抛出NotFoundError:
async function checkDirectoryExists(directoryHandle) { try { // 尝试获取当前目录,不创建新目录 await directoryHandle.getDirectoryHandle('.', { create: false }); return true; } catch (err) { if (err.name === 'NotFoundError') { return false; } // 处理其他错误,比如权限不足 throw err; } }
方法2:尝试迭代目录条目
调用keys()获取目录条目的异步迭代器,然后调用next()尝试获取第一个条目。即使目录是空的,只要目录存在,这个操作就会返回{ done: true };如果目录不存在,则会抛出NotFoundError:
async function checkDirectoryExists(directoryHandle) { try { const iterator = directoryHandle.keys(); await iterator.next(); return true; } catch (err) { if (err.name === 'NotFoundError') { return false; } // 其他错误(如权限问题)需另行处理 throw err; } }
注意事项
- 竞态条件:即使检查返回
true,在你后续执行实际操作前,目录仍有可能被删除。所以最佳实践还是在实际操作(比如getFileHandle)时也捕获NotFoundError,预检查只是作为优化手段。 - 权限问题:如果用户已撤销了目录的访问权限,会抛出
PermissionError,这和目录不存在的错误要区分开,不要误判为目录不存在。 - 空目录兼容:上述两种方法都能正确处理空目录的情况,不会因为目录为空就返回
false。
你可以根据自己的场景选择其中一种方法,在使用存储的FileSystemDirectoryHandle前先调用这个检查函数,就能提前知道目录是否还存在了。
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

