Node.js最佳实践:检查文件是否存在

5
什么是使用Node.js检查文件是否存在的最佳实践?
在其他问题中,我看到很多答案说要使用fs.exists
文档中说:
特别是,在打开文件之前检查文件是否存在是一种反模式,会使您容易受到竞争条件的影响:另一个进程可能会在调用fs.exists()和fs.open()之间删除该文件。只需打开文件,并在找不到文件时处理错误。
当你打开一个文件时会发生什么?它会一直保持打开状态直到你关闭它吗(这是一种泄漏吗)?因此,你必须在打开文件后关闭它吗?如果我使用fs.exists,那我也会打开文件吗?
这是否意味着检查文件是否存在的最佳方法是:
fs.open('path/file.js', function(err, fd) {
    if (err && err.code == 'ENOENT') {
        // Does not exist
    } else if (!err) {
        // Does exist
        fs.close(fd);
    } else {
        // Some other error
    }
}
1个回答

3
当您打开一个文件时会发生什么?它会一直保持打开状态直到您关闭它吗(这算是泄漏吗)?
是的,如果您打开了一个文件,您必须将它关闭。否则,它将保持打开状态,直到您的进程结束。
那么,如果我使用fs.exists,我也会打开文件吗?
仅仅调用fs.exists()并不会打开文件,因此也没有需要关闭的内容。
如果您有理由只检查文件是否存在,那么您应该使用fs.exists()。文档说明了,如果您真正想要打开文件,则无需事先检查fs.exists()。如果您想要打开文件,只需尝试打开它并处理错误即可。

文档中还说:fs.exists() 是一种过时的做法,仅因历史原因而存在。这是值得担心的吗? - Klaasvaak
2
@Klaasvaak 我觉得你不用担心。当然有一些情况下你需要检查文件是否存在...但是,我认为他们是在警告人们在打开文件之前不必要地使用它。 - Brad
@Klaasvaak 这里有一件需要担心的事情:正如您所看到的,exists 的回调函数不像其他 fs 回调函数那样接受错误。我曾经遇到过 exists 导致错误的情况,而 domain 是唯一可以捕获它们的方法。 - vkurchatkin
@vkurchatkin,您能告诉我具体是哪种情况吗? - Klaasvaak
@Klaasvaak 我希望我能确定。很可能是当我尝试检查已被同一进程打开的现有文件时发生了这种情况。 - vkurchatkin
2
@Klaasvaak,在查看了 exists 函数的代码后,我收回了之前说的话,它很可能不是由 exists 函数引起的错误。exists 函数只是调用了 stat 函数并检查了 err,所以你其实可以自己执行这个操作。 - vkurchatkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接