NodeJS 当超出范围时,fs.Dir最终会被释放吗

ax6ht2ek  于 2023-11-17  发布在  Node.js
关注(0)|答案(1)|浏览(106)

我从another question了解到,fs.FileHandle的OS文件句柄永远不会自动释放,即使是垃圾收集器也不会自动释放;代码如下:

const file = await fs.open(path);
// do something with file
await file.close();

字符串

最终崩溃的应用程序与EMFILE: too many open files如果错误反复发生,而做的东西与文件没有关闭它。

  • 注:答案是从2016年开始的。7年后是否仍然适用?*

我的问题是,fs.Dir也是如此吗?

const dir = await fs.opendir(path);

for await (let entry of dir) {
    // do something with entry
}


在这里,dir应该在x1c迭代器到达末尾时自动关闭(如this question(NodeJS fs源代码)所示)。
如果在// do something with entry期间发生错误,它也永远不会关闭吗?

lo8azlld

lo8azlld1#

fs.Dir将在for/of迭代结束时(例如,当迭代器完成时)“自”关闭。
但是,如果你不让迭代器走到最后,你将不得不在fs.Dir对象上调用.close()
Nodejs目前不会在垃圾收集时关闭系统资源,他们可能会在将来实现这一功能(通过在GC系统中添加一些钩子),但这不是现在发生的事情。你必须使用一些更高级别的功能,当操作完成时自动关闭系统资源(比如流可能对文件句柄执行的操作),或者您必须手动确保为该资源调用适当的方法来释放它,比如在所有代码路径中使用.close()
如果在//期间发生错误,它也永远不会被关闭吗?
这取决于您是否捕获在您自己处理迭代时发生的错误,并在错误发生后继续使用迭代器,允许它完成迭代,然后自动关闭,或者如果您提前中止迭代,则必须手动调用fs.Dir上的.close()
垃圾收集不会为您调用操作系统句柄上的close。

相关问题