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